28

stdout および場合によっては stderr に書き込むプログラムがあります。stdout と stderr をキャプチャして、python から実行したいと思います。私のコードは次のようになります:

from subprocess import *

p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()

いくつかのプログラムでは、これで問題なく動作しますが、新しいプログラムを追加すると、新しいプログラムが永久にハングします。を削除するstdout=PIPEと、プログラムはその出力をコンソールに書き込み、終了し、すべて問題ありません。ハングの原因を特定するにはどうすればよいですか?

Windows XP で Python 2.5 を使用しています。プログラムは stdin から読み取りませんし、いかなる種類のユーザー入力 (つまり、「キーを押す」) もありません。

4

2 に答える 2

51

パイプのバッファーがいっぱいになると (通常は 4KB 程度)、書き込みプロセスは、読み取りプロセスが問題のデータの一部を読み取るまで停止します。しかし、ここでは、サブプロセスが完了するまで何も読んでいないため、デッドロックが発生します。 のドキュメントは、wait実際に非常に明確に述べています。

警告子プロセスが stdout または stderr パイプに十分な出力を生成し、OS パイプ バッファーがさらにデータを受け入れるのを待ってブロックする場合、これはデッドロックになります。これを回避するには、communicate() を使用します。

communicate何らかの理由で使用できない場合は、サブプロセスで一時ファイルに書き込みwait、準備ができたらそのファイルを読み取ることができます。パイプではなくファイルに書き込むことで、デッドロックのリスクはありません。

于 2009-09-18T16:36:04.630 に答える
3

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

于 2009-09-18T16:37:11.413 に答える