2016-06-01 7 views
1

私はPython 3でサブプロセスを実行し、常に出力を読み込もうとしています。私は、以下を参照してくださいのPython 3でsubprocessのドキュメントでPython 3のサブプロセスでPopenの待機や通信を使ってstdoutを読むべきでしょうか?

Popen.wait(タイムアウト=なし)

子プロセスが終了するまで待ち。 returncode属性を設定して返します。 警告stdout = PIPEおよび/またはstderr = PIPE を使用すると、デッドロックが発生し、子パイプラインがパイプに十分な出力を生成し、OSパイプバッファがより多くのデータを受け入れるのをブロックするようになります。それを避けるには communicate()を使用してください。

私はcommunicateを使用するべきだと思います。標準出力からのデータ量がかなり大きいからです。しかし、再びドキュメントを読んで、この例を示します。

Popen.communicate(入力=なし、タイムアウト=なし)...

をプロセスとの対話:標準入力にデータを送信します。ファイルの終わりに達するまで、stdoutとstderrからデータを読み込みます。

メモデータの読み込みはメモリにバッファされているため、データサイズが大きい場合または の値が無制限の場合は、この方法を使用しないでください。

このように、やはりstarndardをサブプロセスからこのように読み取ることには問題があるようです。誰かが、サブプロセスを実行し、(潜在的に大量の)stdoutをすべて読み取るための最も安全な方法を教えてもらえますか?

+0

は、これらのメソッドの両方お待ちしております役立つことを願っています。 –

+0

私はそれを逃した。ありがとうございました。私もこれを閉じるために投票する。 – Startec

答えて

1

私はあなたがコミュニケーションを使うべきだと思います。このメッセージは、メソッドのデフォルトの動作に関するパフォーマンスの問題について警告します。実際には、大きなデータサイズのために多くのパフォーマンスを改善するためにチューニングできるpopenコンストラクタのバッファサイズパラメータがあります。

は、私は上記のコメントで問題の答えはあなたにそれを実行している間、チャンクで出力を処理する方法が表示されます、それはプロセスが終了するのを:)

関連する問題