2017-08-07 58 views
0

我一直在用子進程模塊測試stderr。如果我寫與殼的簡單測試=真與Linux外殼命令ls故意壞類型的:python:stderr with shell = True或shell = False in subprocess module

p=subprocess.Popen(["lr"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) 
out, err=p.communicate() 
print ("standard error") 
print(err) 

它輸出通常從外殼:lr: command not found

但如果shell=False,我不明白爲什麼該程序具有執行

Traceback (most recent call last): 
    File "importInteresantes.py", line 6, in <module> 
     p=subprocess.Popen(["lr"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) 
    File "/usr/lib/python2.7/subprocess.py", line 390, in __init__ 
errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1024, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 

我認爲這會給我同樣的輸出錯誤。代碼錯誤還是我應該獲得同一個stderr的觀點?

注:萬一我也試圖與python3

+0

在這兩種情況下,用於啓動命令的機制非常不同。爲什麼您確實希望錯誤診斷結果相同? – NPE

+0

「lr:command not found」是一個shell錯誤消息。如果你不使用shell,那麼你沒有一個shell來顯示你的shell錯誤消息。 – jasonharper

+0

但我期望的是,該程序至少運行,然後彈出一些錯誤。並不是說它根本無法運行。所以你不知道的情況下,我用python輸入錯誤的命令?我也聽說使用'shell = True'可能會有風險 –

回答

1

隨着shell=True,巨蟒啓動一個外殼,並告訴運行lr外殼。 shell運行良好,未能找到lr程序,並生成報告此故障的錯誤輸出。使用shell=False時,Python試圖直接運行lr。由於沒有lr程序可以運行,Python無法找到與lr對應的可執行文件。 Python根本無法啓動子進程,並且沒有可讀取的stdout或stderr流。 Python引發了一個異常報告,無法找到該文件。

此行爲是正常的和預期的。

+0

好的,最後,我想程序中的錯誤總是讓它無法執行。感謝您的答案 –