2013-01-21 10 views
6

ハング好きはPythonのpopenの()。stdout.read()私はPythonの<code>subprocess.Popen</code>を使用して、別のスクリプトの出力を取得しようとしている

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

それは私が実行した場合にのみ、第三行でハングアップし、次の私はPythonのスクリプトとしてこれを再現することはできません。

もう1つのスクリプトはほんの数ワードしか出力しませんが、バッファの問題ではないと想定しています。

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

+0

コマンドを手動で 'command'で実行すると、出力は生成されますか? –

答えて

0

.wait().read()ではなく、.communicate()を使用します。 stdout=PIPEおよび/またはstderr=PIPEを使用している場合

デッドロックされます。この警告と子プロセスはブロックを受け入れるためにOSパイプバッファを待っているようなパイプに十分な出力を生成します。subprocessドキュメントページ上の警告についてwait()に注意してください。より多くのデータ。それを避けるにはcommunicate()を使用してください。

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

+0

答えをありがとう。私はちょうど私がドキュメントのその部分を読んだことを実現しました..スクリプトの実行中にprocess.poll()がループしていない間に 'stdout'をリアルタイムでフェッチしていました。バージョンを削除しました。しかし、私はそれが同じデッドロックの問題のためにぶら下がっていたと思います... – lyomi

0

リード()を返す前にEOFを待ちます。あなたができる

:サブプロセスの

  • 待ち時間が死ぬこと、それから読んで()を返します。
  • 出力が行に分割されている場合はreadline()を使用します(出力行がない場合でもハングします)。
  • Fから最大Nバイトを返すos.read(F、N)を使用しますが、パイプが空の場合はブロックします(O_NONBLOCKがfdに設定されている場合を除く)。
関連する問題