2011-12-13 48 views
0
# 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从Popen获得实时输出

subscript.py:

import time 
i=0 
while (i<5): 
    time.sleep(1) 
    i += 1 
    print "ouput:",i 

由于魔方提到有问过几个类似的问题。我尝试了所有我发现的并没有解决我的问题。希望有人可以在拨打subscript.py时指出其不工作的原因。

编辑: 问题在这里:subscript.py的输出没有刷新,直到它自己终止。 也subscript.py没有任何标准错误,所以调用sp.stderr.readline()导致无限的等待。 解决方案: 刷新输出在subscript.py 所有stderr,我只是使用stderr = subprocess.STDOUT重定向到标准输出。

+0

可能的重复:http://stackoverflow.com/questions/803265/getting-realtime-output-using-subprocess – rubik 2011-12-13 20:30:07

+0

其他重复:http://stackoverflow.com/questions/1085071/real-time-intercepting-of -stdout从 - 另一个进程合蟒。其实有*很多重复,你只需要搜索。 http://stackoverflow.com/questions/527197/intercepting-stdout-of-a-subprocess-while-it-is-running – rubik 2011-12-13 20:35:19

回答

2

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