2011-03-02 77 views
10

我試圖從python 2.7中作爲子進程或線程啓動一個程序(HandBreakCLI)。我已經開始,但我無法弄清楚如何監視它的stderr和stdout。Python監控stderr和子進程的stdout

程序分別輸出它的狀態(%完成)和關於編碼到stderr和stdout的信息。我希望能夠定期檢索從適當的流中完成的%。

我試着調用subprocess.Popen,將stderr和stdout設置爲PIPE並使用subprocess.communicate,但它坐下並等待,直到進程終止或完成,然後檢索輸出。對我沒有好處。

我已經把它作爲一個線程運行,但據我所知,我仍然必須最終調用subprocess.Popen來執行程序並運行到同一個牆上。

我對此有何看法?我還有什麼其他選擇,或者如何讓這個按照所描述的方式工作?

+0

'溝通()'總是等待進程結束;你必須直接從stderr讀取。你可以發佈一些代碼嗎? – senderle 2011-03-02 21:51:39

回答

13

我已經完成了與ffmpeg相同的功能。這是相關部分的簡化版本。 bufsize=1表示行緩衝,可能不需要。

def Run(command): 
    proc = subprocess.Popen(command, bufsize=1, 
     stdout=subprocess.PIPE, stderr=subprocess.STDOUT, 
     universal_newlines=True) 
    return proc 

def Trace(proc): 
    while proc.poll() is None: 
     line = proc.stdout.readline() 
     if line: 
      # Process output here 
      print 'Read line', line 

proc = Run([ handbrakePath ] + allOptions) 
Trace(proc) 

編輯1:我注意到,子過程(在這種情況下手剎)需要衝洗後線以使用該(FFMPEG一樣)。

編輯2:一些快速測試顯示bufsize=1可能實際上並不需要。

+0

除非OP沒有使用默認值,否則不應該需要降低'bufsize',儘管將其設置爲緩衝行可能是一個好主意:「bufsize的默認值爲0(無緩衝)。」 http://docs.python.org/library/subprocess.html – user470379 2011-03-02 22:14:06

+0

你是對的,我只記得將bufsize設置爲1有一些意義和效果:)相應地進行編輯。 – 2011-03-02 22:15:48

+0

編輯1的+1:「子過程需要在行之後刷新」。 – db42 2011-08-21 19:15:27