16

待機のドキュメント(http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait)には、次のように書かれています。

警告

これは、stdout=PIPEおよび/またはstderr=PIPEを使用するときにデッドロックし、子プロセスがパイプに十分な出力を生成して、OSパイプバッファーがより多くのデータを受け入れるのをブロックするようにします。これを回避するには、communicate()を使用します。

このことから、 ifが必要ない場合のすべての使用法communicate置き換えることができると思います。また、またはがPIPEでない場合でも、。に置き換えることができます。wait()retcodestdoutstdinwait()communicate()

そうですか?ありがとう!

4

1 に答える 1

7

PIPEを使用しない場合、communicate()はwait()に短縮されると思います(ドキュメントには2.6の時点で明示的に記載されていません)。したがって、 PIPEを使用しない場合は、wait()を置き換えても問題ありません。

PIPEを使用する場合は、OSパイプバッファをいっぱいにするのと同じようにメモリバッファをオーバーフローさせることができるため(communicate()注を参照)、大量の出力を処理している場合はどちらも機能しません。

私が(少なくとも2.4で)通信した実際のメモでは、出力が行ベースのプログラムから1行に1文字を与えてくれましたが、それは穏やかに言えば役に立ちませんでした。

また、「retcodeは必要ありません」とはどういう意味ですか?--wait()と同じようにPopen.returncodeを設定すると思います。

于 2012-12-12T21:47:16.910 に答える