web-dev-qa-db-fra.com

attendre le processus jusqu'à la fin du sous-processus?

J'ai un processus principal qui crée deux sous-processus ou plus, je veux que le processus principal attende que tous les sous-processus terminent leurs opérations et se terminent?

 # main_script.py

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

Un objet Popen a une méthode .wait() définie exactement pour cela: attendre la fin d'un sous-processus donné (et, en outre, le réaccord de son état de sortie) .

Si vous utilisez cette méthode, vous éviterez que les zombies de processus traînent trop longtemps.

(Vous pouvez également utiliser subprocess.call() ou subprocess.check_call() pour appeler et attendre. Si vous n'avez pas besoin de IO avec le processus, cela pourrait suffire. Mais ce n'est probablement pas une option, car votre si les deux sous-processus semblent être supposés fonctionner en parallèle, ce qu'ils ne feront pas avec (check_)call().)

Si vous avez plusieurs sous-processus à attendre, vous pouvez faire

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

qui revient dès que tous les sous-processus sont terminés. Vous avez alors une liste de codes de retour que vous pouvez peut-être évaluer.

94
glglgl
subprocess.call

Attend automatiquement, vous pouvez également utiliser:

p1.wait()
18
Gjordis