2016-12-14 116 views
0

我知道這是一個常見問題,我嘗試了任何解決方案,我可以在這裏和其他網站上找到^,但無法解決我的問題。 我的困境看起來如下(在Windows上):Python子進程通信掛起

我有一個主腳本(main.py),我通過Popen調用另一個腳本(sniffer.py)創建一個子進程。之後,我在main.py中做了一些工作,最後想要發送一個字符到子進程中去完成sniffer.py中的無限循環,最後是整個子進程。

main.py

process = Popen(["python", "sniffer.py", receiverIP, senderIP, "udp", path],stdin=PIPE) 
#do some stuff 
process.communicate('terminate') 

sniffer.py

def check(done): 
    while True: 
     if sys.stdin.read() == 'terminate': 
      done = True 
      break 
def sniff(someparams): 
    done = False 
    input_thread = threading.Thread(target=check, args=(done,)) 
    input_thread.daemon = True 
    input_thread.start() 
    while True: 
     #do some stuff 
     if done: 
      break 

我也嘗試將電話溝通與stdin.write結合,但它沒有任何效果。

注:我注意到,在sniffer.py while循環我交流()調用後不會繼續(整個腳本只是掛起)

+0

你能指定它是如何特別'沒有工作'嗎?請提供您的輸出以幫助調試。 – AndyW

+0

我編輯了我的問題 – braheem38

回答

2

無關,與subprocess

您在本地將done更改爲True。您必須全局定義最後一個環才能正常退出。

done = False 

def check(): 
    global done 
    while True: 
     if sys.stdin.read() == 'terminate': 
      done = True 
      break 
def sniff(someparams): 
    global done 
    done = False 
    input_thread = threading.Thread(target=check) 
    input_thread.daemon = True 
    input_thread.start() 
    while True: 
     #do some stuff 
     if done: 
      break 
+0

它沒有幫助,代碼仍然掛在溝通()。通信調用正確地設置爲true,但sniff()中的while循環掛起後, – braheem38

+0

嘗試在「while True」循環中添加打印語句,並在之後查看它是否已到達。 –