2013-02-27 11 views
45

Ho un processo principale che crea due o più sottoprocessi, voglio che il processo principale attenda fino a quando tutti i sottoprocessi finiscono le loro operazioni ed escono?attendere il processo fino al completamento di tutti i processi secondari?

# main_script.py 

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

utilizzare il metodo wait: 'p1.wait(); p2.wait() ' –

+1

controlla questa domanda: 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

risposta

69

Un oggetto Popen ha un metodo .wait() esattamente definito per questo: per attendere il completamento di un determinato sottoprocesso (e, oltre a , per risintonizzare il suo stato di uscita).

Se si utilizza questo metodo, si impedisce che gli zombi di processo siano in giro troppo a lungo.

(In alternativa, è possibile utilizzare subprocess.call() o subprocess.check_call() per chiamate e in attesa.Se non si ha bisogno di IO con il processo, potrebbe essere sufficiente.Ma probabilmente questa non è un'opzione, perché se i due sottoprocessi sembrano si suppone per l'esecuzione in parallelo, il che essi non con (check_) call().)

Se si dispone di diversi sottoprocessi per aspettare, si può fare

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

che restituisce non appena tutti i sottoprocessi hanno finito. Quindi hai una lista di codici di ritorno che puoi valutare.

+6

La domanda era come aspettare * tutti i sottoprocessi, non solo uno. –

+2

@GregWard Se aspetto parecchie cose, posso aspettare tutto in successione. Soprattutto in questa situazione. – glglgl

+2

E non penso che la mancanza di questo dettaglio renda la risposta inutile. – glglgl

12
subprocess.call 

attende automaticamente, è anche possibile utilizzare:

p1.wait() 
Problemi correlati