0

subprocess.Popen の使用時に問題が発生しました。ここで問題を解決しました。次の編集を fake_utility.py に追加すると、stderr=subprocess.PIPE が subprocess.Popen に追加されます。

#fake_utility.py
import time
i = 0
while True:
   print hex(i)*512
   i += 1
   time.sleep(0.5)

#python interpreter
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for err in proc.stderr:
    print "err::", err

for line in proc.stdout:
   print "test:", line.rstrip()

プログラムは応答しません。Ctrl-C を押すと、次のようになります。

Traceback (most recent call last):
File "run_fake_utility.py", line 6, in <module>
    err = proc.stderr.readline()
KeyboardInterrupt

proc.stderr.readline() でブロックされています。proc.stderr から行の読み取りを削除すると、プログラムは正常に実行されます。

考えられるエラーは何ですか?Python2.6を使用しています。

4

1 に答える 1

1

STDERR からの読み取りのブロックは、サブプロセスがそのファイルハンドルに何も書き込んでいないことを示します。

あなたは実際に何かを期待していましたか?(つまり、同じコマンドをシェルから手動で実行し、STDERR2>file.txtをファイルにリダイレクトした場合、そのファイルは空ではありませんか?)

そうしないと、発生する可能性のある一般的なことがいくつかあります。

  • STDERR 出力でまだ改行を受け取っていません
  • 基礎となるバッファを満たすのに十分なデータをまだ受け取っていません
于 2013-01-16T05:20:37.997 に答える