2014-10-27 64 views
0

我想爲Ubuntu創建一個python安裝腳本。我試圖通過創建腳本來自動化它,而不必輸入所有的下載和編譯命令。我真正想要的是不打印命令的所有輸出,只輸出錯誤,並將常規輸出打印到文件中。爲什麼subprobess.call()和subprocess.Popen打印時,他們不應該?

我看了this stackoverflow指南和this python文件,但有一些我只是無法弄清楚。每當我將調用和Popen的stdout參數設置爲None時,它仍然會將輸出打印到shell,根據python文檔,它不應該發生。

例如,假設我們在一個包含幾個文件「a」,「b」和「c」的目錄中。根據python文檔,以下命令應該只輸出0.

>>> subprocess.call(["ls", "-a"]) 
0 

但我沒有那樣做。相反,我得到的輸出:

>>> subprocess.call(['ls', '-a']) 
. .. a b c 
0 

我已經嘗試設置標準輸出參數設置爲None,但它仍然是打印輸出,這是不對的。 Subprocess.Popen具有相同的確切行爲。我怎樣才能讓Python不打印輸出?

爲了記錄,我使用python 3.4.0運行Ubuntu 14.04 64位。

編輯:我也嘗試了以上從文件內執行該文件,但我仍然得到不正確的行爲。

+0

我的理解你的問題,你想從運行巨蟒文件中的命令? 然後將其輸出到文件,如果有錯誤,請在命令行上顯示它們? – smushi 2014-10-27 05:48:56

+0

@smushi,是的,這是正確的。 – wheeler 2014-10-27 14:04:17

回答

3

您應該仔細閱讀文檔;從subprocess.call

完整的函數簽名相同的POPEN構造的[...]

而且從subprocess.Popen

隨着無的默認設置,不會發生重定向;孩子的文件句柄將從父類繼承。

所以一般情況下,將stdout設置爲None,將其設置爲subprocess.STDOUT。如果您需要抑制輸出將其設置爲subprocess.DEVNULL,或將其存儲在輸出文件中,則只需將打開的文件對象設置爲參數即可。

要捕獲並處理輸出,請使用subprocess.check_output

+1

+1爲文檔參考。不要設置'stdout = STDOUT'(這是一個錯誤)。只有'stderr = STDOUT'是有道理的。 – jfs 2014-10-27 07:29:02

+0

@Arpegius謝謝,我不太明白當我閱讀它時是什麼意思。 – wheeler 2014-10-27 14:08:12

+0

@wheeler評論中無需坦克。請點擊綠色複選標記接受我的回答。 – Arpegius 2014-10-27 14:11:22

0

None表示繼承父母的標準流。爲了stdout重定向到一個文件,並允許標準錯誤,繼續打印到外殼(如果父母的標準錯誤打印到外殼):

import subprocess 

with open('your_script.log', 'a') as logfile: 
    subprocess.check_call(['ls', '-a'], stdout=logfile) 
相關問題