读取子进程的STDERR

时间:2013-01-16 05:12:33

标签: python subprocess

使用subprocess.Popen时遇到了问题。我经历了问题here。当我将以下编辑添加到fake_utility.py中,即在subprocess.Popen中添加 stderr = subprocess.PIPE

#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。

1 个答案:

答案 0 :(得分:1)

阻止从STDERR读取将表明子进程没有向该文件句柄写入任何内容。

你真的在期待什么吗? (即:如果从shell手动运行相同的命令并将STDERR - 2>file.txt重定向到文件,该文件是非空的吗?)

否则,可能会发生一些常见的事情:

  • 您尚未在STDERR输出中收到换行符
  • 您尚未收到足够的数据来填充某些底层缓冲区