2012-11-13 70 views
0

我想調用一個進程並輸出它的stdd和stout到一個字符串進行檢查。此代碼觸發意外的錯誤塊。subprocess.Popen sterr to string

try: 
    proc = subprocess.Popen('ls -ddd 1>&2', stdout=subprocess.PIPE, stderr=subprocess.PIPE,) 
    stdout,stderr = proc.communicate() 
    if len(stderr)>1: 
     actualResult =stderr 
    else: 
     actualResult =stdout 
    print actualResult 
except: 
    print "Unexpected error" 

我基於它的http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html,但我顯然缺少的東西。是否有可能在try塊內完成此操作?

回答

3

你不應該使用一個通用的Except條款,因爲這將趕上任何異常,並阻止您固定腳本(每個任何異常被捕獲,所以你怎麼知道哪一個發生?)。

在這裏,如果您刪除了Except塊,您將遇到OSError: [Errno 2] No such file or directory。這意味着subprocess.Popen尚未找到您在路徑上要求的可執行文件。

發生這種情況的原因是您沒有將shell = true傳遞給您的Popen調用。
不通過shell = True這意味着subprocess.Popen正在尋找名爲"ls -ddd 1>&2"的可執行文件,相當於在您的提示下字面上寫入"ls -ddd 1>&2",並且會導致「未找到命令!」。
(除非你碰巧有名稱中含有空格和&符號的可執行文件!)

這當然你想要什麼,你想要的是調用的說法-ddd和變向ls命令1>&2


長話短說,加shell = True給你的電話。