从Popen获得实时输出

时间:2011-12-13 20:25:48

标签: python subprocess 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也没有任何stderr所以调用sp.stderr.readline()会导致无限等待。 解: 在subscript.py中刷新输出 对于所有stderr,我只使用stderr = subprocess.STDOUT重定向到stdout。

1 个答案:

答案 0 :(得分:2)

您是否尝试在sys.stdout.flush()声明后调用子流程中的print?你可能会遇到输出缓冲。