15

subprocess.Popen次のようなPythonを使用して、別のスクリプトの出力を取得しようとしています

process = Popen(command, stdout=PIPE, shell=True)
exitcode = process.wait()
output = process.stdout.read()   # hangs here

Pythonスクリプトとして実行し、Pythonシェルでこれを再現できない場合にのみ、3行目でハングします。

他のスクリプトはほんの数語を出力しますが、これはバッファの問題ではないと思います。

誰かが私がここで間違っていることについて考えていますか?

4

3 に答える 3

5

おそらくプラス.communicate()ではなく使用したいと思うでしょう。ドキュメントページの警告に注意してください。.wait().read()wait()subprocess

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

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

于 2013-01-21T06:59:37.357 に答える
0

read()はEOFを待ってから戻ります。

あなたはできる:

  • サブプロセスが終了するのを待ってから、read()が戻ります。
  • 出力が行に分割されている場合はreadline()を使用します(出力行がない場合でもハングします)。
  • Fから最大Nバイトを返すos.read(F、N)を使用しますが、パイプが空の場合はブロックされます(fdにO_NONBLOCKが設定されている場合を除く)。
于 2017-11-14T23:54:02.990 に答える
0

次のソースで、stdout/stderrのハングした読み取りに対処する方法を確認できます。

readingproc

于 2019-03-23T16:20:51.863 に答える