从Popen获取实时输出
# cmd = "python subscript.py"
cmd = "ping localhost -n 10"
ofile =open("C:\file.log","w")
sp = subprocess.Popen(cmd,bufsize = 1, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
while True:
sp.poll()
line = sp.stdout.readline()
#eline = sp.stderr.readline()
if line:
print line
ofile.write(line)
#if eline:
# print eline
# ofile.write(" ERROR: "+line)
# if (line == "" and eline == ""):
if (line == ""):
break
我正在尝试从一个子进程获取输出,并把它保存到一个日志文件中,使用的代码如上所示。对于 ping localhost -n 10
这个命令,它运行得很好。但是当我用它来调用 subscript.py
时,我无法实时获取 subscript.py
的输出。我只能在 subscript.py
结束后才能看到所有的输出。有没有什么建议?另外,我必须把 eline = sp.stderr.readline()
这一行注释掉才能让它正常工作。你知道为什么有些代码不能让我实时获取 subscript.py
的输出吗?
subscript.py:
import time
i=0
while (i<5):
time.sleep(1)
i += 1
print "ouput:",i
正如 rubik 提到的,之前有几个类似的问题被提过。我尝试了我找到的所有方法,但没有一个能解决我的问题。希望有人能指出为什么在调用 subscript.py
时它不工作的原因。
编辑:
问题在于:subscript.py
的输出在它自己结束之前不会被刷新。
而且 subscript.py
没有任何错误输出,所以调用 sp.stderr.readline()
会导致无限等待。
解决方案:
在 subscript.py
中刷新输出。
对于所有的错误输出,我只是使用 stderr = subprocess.STDOUT
将其重定向到标准输出。
1 个回答
2
你有没有试过在你的子进程中,在print
语句之后调用一下sys.stdout.flush()
?你可能遇到了输出缓冲的问题。