stdout = PIPEの場合、subprocess.Popen wait()が永遠に待機する理由を調べるにはどうすればよいですか?
-
22-07-2019 - |
質問
stdoutおよび場合によってはstderrに書き込むプログラムがあります。 Pythonから実行し、stdoutとstderrをキャプチャします。私のコードは次のようになります:
from subprocess import *
p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()
いくつかのプログラムでは、これは正常に機能しますが、新しいプログラムを追加すると、新しいプログラムは永久にハングします。 stdout = PIPE
を削除すると、プログラムはその出力をコンソールに書き込み、終了し、すべてが正常になります。ハングの原因を特定するにはどうすればよいですか?
Windows XPでのPython 2.5の使用。プログラムは、stdinからの読み取りも、ユーザー入力の種類もありません(つまり、「キーを押す」)。
解決
パイプのバッファがいっぱいになると(通常4KB程度)、読み取りプロセスが問題のデータの一部を読み取るまで書き込みプロセスは停止します。しかし、ここでは、サブプロセスが完了するまで何も読んでいないため、デッドロックが発生します。 wait
のドキュメント非常に明確に:
警告これにより、 子プロセスは十分な出力を生成します 次のようなstdoutまたはstderrパイプへ OSパイプの待機をブロックします より多くのデータを受け入れるためのバッファ。つかいます それを避けるために、communicate()。
何らかの理由で communicate
を使用できない場合は、サブプロセスに一時ファイルへの書き込みを行わせ、準備ができたら wait
してそのファイルを読み取ることができます- -パイプではなくファイルに書き込みを行っても、デッドロックのリスクはありません。
所属していません StackOverflow