stdout = PIPEの場合、subprocess.Popen wait()が永遠に待機する理由を調べるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1445627

  •  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 してそのファイルを読み取ることができます- -パイプではなくファイルに書き込みを行っても、デッドロックのリスクはありません。

他のヒント

ドキュメントをご覧ください。デッドロックを引き起こす可能性があるため、待機は使用しないでください。 通信を使用してみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top