2013-06-28 69 views
0

我使用Python的subprocess.calldocs here),我有一個關於標準輸出的問題。Python:只從subprocess.call()打印stderr,而不是stdout?

我有以下命令:

subprocess.call("wget http://google.com", shell=True) 

它的偉大工程,但它打印的wget的輸出,所以我得到一個絕對噸像wget輸出:

--2013-06-28 08:54:47-- http://google.com/ 
Resolving google.com... 173.194.41.100, 173.194.41.98, 173.194.41.97, ... 
Connecting to google.com|173.194.41.100|:80... connected. 
HTTP request sent, awaiting response... 301 Moved Permanently 
.... etc 

我怎樣才能改變電話,以便只有在出現錯誤時纔打印任何內容?

我已經嘗試過學習the subprocess docs,但是我覺得我太缺乏經驗,無法爲自己弄明白。

+0

你試過'urllib.urlretrieve()'或'urllib2.urlopen()'嗎? – jfs

回答

1

其實我覺得最簡單的方法是使用'wget'具有的'-q'選項。您仍然可以通過查看返回值來發現錯誤。

+0

這是一個很好的提示,謝謝! – Richard

1

wget通常會報告全部在stderr上輸出,因此重定向stdout只會幫助獲取錯誤。

您可以使用-nv(非詳細)或-q(安靜)作爲選項,wget的,但不同之處在於-q甚至不報告錯誤而-nv報告錯誤或一個成功的線標準錯誤。

返回代碼在兩種情況下都沒有改變,所以它可以用來檢測任何錯誤,如果這是您喜歡的方式。

編輯:如果你真的只是想忽略從wget的輸出的所有,你可以重定向stderrstdout到空設備;

import subprocess 
import os 

DEVNULL = open(os.devnull, 'wb') 

subprocess.call("wget http://google.com/", stdout=DEVNULL, stderr=DEVNULL, shell=True) 

在我的Python 3.3.1安裝,DEVNULL可以從子進口替代,但我不能找到什麼版本,它是在添加文件。在這兩個Python2和Python3上述作品。

+0

謝謝!有沒有什麼辦法可以完全消除「wget」 - 甚至不會報告錯誤?對我而言,'-q'選項在成功時打印一行,我想知道是否有辦法打印任何內容。 – Richard

+1

啊,剛剛意識到我可以做'wget_output = subprocess.call(...)',並且不打印任何東西:) – Richard

相關問題