2017-02-20 61 views
0

我需要實現一個逐行讀取其他進程的輸出的python腳本。很顯然,我曾嘗試使用「subprocess」來獲取stdout的輸出過程。但是我無法實時獲得輸出,事實上每次python腳本都會在進程啓動後的幾個時間塊內返回輸出。對於爲例我用這個python腳本:要讀取如何用python實時讀取輸出過程?

import subprocess as sub 
import sys 

proc = sub.Popen(["python", "bin/read_test.py"], 
       stdout = sub.PIPE, 
       bufsize = 1) 

while True: 
     if proc.poll() is None: 
       line = proc.stdout.read() 
       line = line.decode("utf-8") 
       print(line, flush = True) 
       sys.stdout.flush() 
     else: 
       proc.stdout.close() 
       break 

read_test.py腳本:

from time import sleep 

for i in range(5): 
     print(i) 
     sleep(1) 

我已經嘗試了很多方法用「的ReadLine()」與循環,但問題還是一樣。

此外,我不想使用「溝通」,因爲它是一種阻止方法。

感謝您的幫助,

+0

可能的複製(http://stackoverflow.com/questions/ 2804543/read-subprocess -stdout-line-line) – pltrdy

回答

1

問題是,你要充分閱讀stdout

由於python發現該進程仍在運行,它會等待進程結束,以便進程輸出完成。

做你想做的,你可能要使用到逐行讀取輸出線什麼line = proc.stdout.readline()

你可能必須改變你的循環讀取線,並停止當過程結束

proc = sub.Popen(["python", "bin/read_test.py"], 
       stdout = sub.PIPE, 
       bufsize = 1) 

while True: 
    line = proc.stdout.readline() 
    if line: 
     line = line.decode("utf-8") 
     print(line) 
     sys.stdout.flush() 
    if proc.poll() is not None: # process ends 
     break 

proc.wait() 

而且這還不夠:您必須在read_test.py一側輸出flush以確保發射器實際發送線路(輸出重定向時,不確定)。例如節目:

import time,sys 

for i in range(5): 
    print(i) 
    sys.stdout.flush() # not flushing: you get all the lines at the end of the process 
    time.sleep(1) 

我連接兩個節目,並得到了1測序輸出(1,2,3,4,5)的[讀出由線子標準輸出線]每個第二

+0

好的,在read_test.py中添加flush已經解決了我的問題,謝謝。 – Guillaume