2016-12-14 4 views
0

Ich weiß, dass dies eine häufig gestellte Frage ist, und ich habe versucht, jede Lösung Ansatz, den ich hier und auf anderen Seiten finden konnte^aber konnte mein Problem nicht lösen. Mein Dilemma sieht wie folgt aus (unter Windows):Python Subprozess kommunizieren hängt

Ich habe ein Hauptscript (main.py), wo ich einen Unterprozess über Popen erstellen ein anderes Skript (sniffer.py) aufrufen. Danach mache ich ein paar Sachen in main.py und möchte schließlich ein Zeichen an den Subprozess senden, um die Endlosschleife in sniffer.py und schließlich den gesamten Subprozess zu beenden.

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 

Ich habe auch die Kommunikation Anruf mit einem stdin.write zu kombinieren versucht, aber es hatte keine Wirkung.

Anmerkung: Ich habe bemerkt, dass, in sniffer.py die while-Schleife nicht nach meinem kommunizieren() -Aufruf nicht weiter (das gesamte Skript hängt nur)

+0

Können Sie angeben, wie speziell es nicht funktioniert hat? Bitte geben Sie Ihre Ausgabe an, um das Debuggen zu erleichtern. – AndyW

+0

Ich habe meine Frage bearbeitet – braheem38

Antwort

2

nichts mit subprocess zu tun.

Sie ändern done zu True lokal. Sie müssen es global definieren, damit die letzte Schleife ordnungsgemäß beendet wird.

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

Es hat nicht geholfen, der Code hängt immer noch auf(). Der Kommunikationsaufruf setzt korrekt auf true, aber die while-Schleife in sniff() hängt danach – braheem38

+0

versucht, eine print-Anweisung in Ihre 'while-True'-Schleife einzufügen, und danach auch, um zu sehen, ob sie erreicht ist. –