2011-04-22 83 views
2

我想啓動一個子進程並讀取其stderr,但到目前爲止,我根本無法使用subprocess.Popen甚至是stdout讀取任何內容。我試圖使用subprocess.communicate()從stdout和stderr中讀取數據。這是我做的:無法從子進程讀取stderr.Popen

import subprocess 
p = subprocess.Popen('ls') 
s = p.communicate() 
print s 

這給了我輸出(無,無)。我認爲這對是stdin和stderr。是這樣嗎?無論如何,我怎樣才能讀取從subprocess.Popen開始的進程stdout和stderr?

+0

該子過程模塊指南有一個可能有用的部分:http://www.doughellmann.com/PyMOTW/subprocess/#working-with-pipes-directly – 2011-04-22 06:11:39

回答

3

您需要在您創建POPEN對象指定標準輸出= subprocess.PIPE和標準錯誤= subprocess.PIPE:

p = subprocess.Popen('ls', stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
1

從Python文檔(子進程模塊):

Popen.communicate(input=None) 

互動與進程:發送數據到標準輸入。從stdout和stderr中讀取數據,直到達到文件結尾。等待進程終止。可選的輸入參數應該是要發送到子進程的字符串,如果沒有數據應該發送給子進程,則爲None。

communicate()返回一個元組(stdoutdata,stderrdata)。

請注意,如果要將數據發送到進程的stdin,則需要使用stdin=PIPE創建Popen對象。同樣,要在結果元組中獲得除None以外的任何內容,您還需要提供stdout=PIPE和/或stderr=PIPE