2013-02-27 2 views
45

У меня есть основной процесс, который создает два или более подпроцессов, я хочу, чтобы основной процесс ожидал завершения всех подпроцессов их операций и выходов?дожидаться завершения процесса до завершения всего подпроцесса?

# main_script.py 

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

использовать метод wait: 'p1.wait(); p2.wait() ' –

+1

проверить этот вопрос вне: 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

ответ

69

Popen объект имеет метод .wait() точно определенный для этого: ждать завершения данного подпроцесса (и, кроме того, , для перенастройки своего статуса выхода).

Если вы используете этот метод, вы предотвратите, чтобы процесс зомби лежал слишком долго.

(В качестве альтернативы вы можете использовать subprocess.call() или subprocess.check_call() для вызова и ожидания. Если вам не требуется IO с процессом, этого может быть достаточно. Но, вероятно, это не вариант, потому что ваш, если два подпроцесса кажутся быть должны работать параллельно, что они не будут с (check_) call().)

Если у вас есть несколько подпроцессов ждать, вы можете сделать

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

который возвращается, как только все подпроцессы имеют законченный. Затем у вас есть список кодов возврата, которые вы, возможно, можете оценить.

+6

Вопрос состоял в том, чтобы подождать * все * подпроцессы, а не только один. –

+2

@GregWard Если я жду нескольких вещей, я могу ждать все подряд. Особенно в этой ситуации. – glglgl

+2

И я не думаю, что простое отсутствие этой детали делает ответ неполезным. – glglgl

12
subprocess.call 

Автоматически ждет, вы также можете использовать:

p1.wait() 
Смежные вопросы