2011-12-13 98 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()?你可能會遇到輸出緩衝。