2014-01-15 28 views
1

如果我不喜歡:如何獲取命令輸出而不是python中的子進程?

x = subprocess.Popen(["nosetests",  
"TestStateMachine.py:FluidityTest.test_it_has_an_initial_state", "-v"], 
stdout=subprocess.PIPE) 

我從我的命令的輸出執行:

test_it_has_an_initial_state (TestStateMachine.FluidityTest) ... ok 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

OK 

但如果調用x.communicate()例如我:

('', None) 

如何將該消息保存在變量中?

+0

標題有點困惑。這不是命令子進程(或「子進程」模塊)正在竊取你自己的輸出;就是說你的子進程和你的進程都不是在竊取它的輸出,所以輸出將直接輸出到你自己的輸出中,就好像你已經「打印」了一樣。 – abarnert

回答

4

問題幾乎可以肯定的是,你的命令寫入stderr和stdout,而你只捕獲stdout。如果你想獲得它們作爲單獨字符串

x = subprocess.Popen(["nosetests", 
         "TestStateMachine.py:FluidityTest.test_it_has_an_initial_state", 
         "-v"], 
        stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

out_and_err, _ = x.communicate() 

x = subprocess.Popen(["nosetests", 
         "TestStateMachine.py:FluidityTest.test_it_has_an_initial_state", 
         "-v"], 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

out, err = x.communicate() 

這解釋下

如果你想兩個一起合併成一個字符串,這樣做Frequently Used Arguments

stdin,stdout and stderr分別指定執行的程序的標準輸入,標準輸出和標準錯誤文件句柄。有效值爲...另外,stderr可以是STDOUT,這表示應該將子進程的stderr數據捕獲到與stdout相同的文件句柄中。

但是,如果您以前從未聽說過標準錯誤,則可以理解您不會去查找此文檔...文檔假定您知道單獨的輸出和錯誤管道的基本C/POSIX模型,每個節目。


作爲一個側面說明,如果你想運行的運行程序,並得到其輸出與標準輸出合併其標準錯誤,你並不需要創建一個Popen並調用它communicate;只是使用check_output

out_and_err = subprocess.check_output([… args …], stderr=subprocess.STDOUT) 
相關問題