从Popen获取实时输出

0 投票
1 回答
1113 浏览
提问于 2025-04-17 08:19
# 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()?你可能遇到了输出缓冲的问题。

撰写回答