2013-02-27 18 views
45

Ich habe einen Hauptprozess, der zwei oder mehr Unterprozesse erstellt. Ich möchte, dass der Hauptprozess wartet, bis alle Unterprozesse ihre Operationen beendet haben und beendet werden.Warten, bis alle Subprozesse abgeschlossen sind?

# main_script.py 

p1 = subprocess.Popen(['python script1.py']) 
p2 = subprocess.Popen(['python script2.py']) 
... 
#wait main process until both p1, p2 finish 
... 
+4

Verwenden Sie die Wait-Methode: 'p1.wait(); p2.wait() ' –

+1

überprüfen Sie diese Frage aus: http://stackoverflow.com/questions/6341358/subprocess-wait-not-waiting-for-popen-process-to-finish-when-using-threads – Calum

+2

http: //stackoverflow.com/questions/100624/python-on-windows-how-to-wait-for-multiple-child-processes – Gjordis

Antwort

69

A Popen Objekt hat eine .wait() Methode genau für diese definiert: für den Abschluss eines bestimmten subprocess zu warten (und außerdem , um seinen Austrittsstatus neu zu bestimmen).

Wenn Sie diese Methode verwenden, verhindern Sie, dass die Prozess-Zombies zu lange herumliegen.

(Alternativ können Sie subprocess.call() oder zum Anrufen und Warten verwenden. Wenn Sie IO mit dem Prozess nicht brauchen, könnte das reichen. Aber wahrscheinlich ist dies keine Option, weil Ihre beiden Subprozesse scheinen angenommen werden, parallel laufen zu lassen, die sie nicht mit (check_) call().)

Wenn Sie mehrere Teilprozesse warten müssen, können Sie

tun
exit_codes = [p.wait() for p in p1, p2] 

die so bald wieder, da alle Teilprozesse haben fertig. Sie haben dann eine Liste von Rückgabecodes, die Sie vielleicht auswerten können.

+6

Die Frage war, wie man auf * alle * Subprozesse wartet, nicht nur auf einen. –

+2

@GregWard Wenn ich auf mehrere Dinge warte, kann ich nacheinander auf alle warten. Besonders in dieser Situation. – glglgl

+2

Und ich glaube nicht, dass das bloße Fehlen dieses Details die Antwort unbrauchbar macht. – glglgl

12
subprocess.call 

automatisch wartet, können Sie auch:

p1.wait() 
Verwandte Themen