web-dev-qa-db-ja.com

すべてのサブプロセスが終了するまでプロセスを待機しますか?

2つ以上のサブプロセスを作成するメインプロセスがあり、すべてのサブプロセスが操作を終了して終了するまでメインプロセスを待機させたいですか?

 # main_script.py

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

Popenオブジェクトには、このために定義された .wait() メソッドがあります。特定のサブプロセスの完了を待機します(さらに、終了ステータスを再調整します)。

この方法を使用すると、プロセスゾンビが長時間横になっていることを防止できます。

(または、呼び出しと待機に subprocess.call() または subprocess.check_call() を使用できます。プロセスでIOが必要ない場合は、それで十分かもしれません。これはオプションではありません。2つのサブプロセスが(check_call()では並行して実行されないように思われるためです。

待機するサブプロセスが複数ある場合は、次のことができます

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

すべてのサブプロセスが終了するとすぐに戻ります。次に、評価できる戻りコードのリストがあります。

94
glglgl
subprocess.call

自動的に待機します。以下も使用できます。

p1.wait()
18
Gjordis