2017-07-03 169 views
0

我正在使用下面的代碼獲取shell命令的輸出。subprocess.CalledProcessError沒有給出錯誤信息

import subprocess 
exitcode, err, out = 0, None, None 
try: 
    out = subprocess.check_output(cmd, shell=True, universal_newlines=True) 
except subprocess.CalledProcessError as e: 
    exitcode, err = e.returncode, e.output 

print("x{} e{} o{}".format(exitcode, err, out)) 

當一個有效的命令被傳遞了cmdecho hello,程序運行正常,並給予輸出(0, None, "hello\n")

但是,如果我給一個錯誤的一種命令的我期待的錯誤消息應該來在err,但它直接打印。例如,如果我通過在cmdls -lrt foo輸出來作爲

[email protected]> python mytest.py 
ls: cannot access foo: No such file or directory 
x2 e oNone 

所以我想ls: cannot access foo: No such file or directory應該err到來。怎麼做?

回答

2

要捕獲錯誤輸出,您需要將另一個參數傳遞給subprocess.check_output()函數。您需要設置stderr=subprocess.STDOUT。這將引導標準輸出爲e.output

subprocess.check_output()是對subprocess.run()的封裝。它通過傳遞一些合理的默認值讓我們的生活更輕鬆。其中一個正在製作stdout=subprocess.PIPE。這會將正在運行的命令的標準輸出重定向到您的程序。同樣,您可以通過傳入參數stderr=subprocess.PIPE將標準錯誤輸出引導到您的程序,這將填充e.stderr,其中e是例外。

讓我知道如果這不明確。