簡體   English   中英

如何處理 subprocess.run() 錯誤/異常

[英]How to handle subprocess.run() error/exception

如何處理 Python 中的 subprocess.run subprocess.run()錯誤? 例如,我想用subprocess.run()運行cd + UserInput 如果用戶輸入一個不存在的目錄名怎么辦? 我該如何處理這種類型的錯誤?

正如@match 所提到的,您不能將cd作為子進程運行,因為cd不是程序,它是 shell 內置命令。

但是,如果您詢問任何子進程失敗,除了cd

try:
    subprocess.run(command_that_might_not_exist)  # like ['abcd']
except Exception:
    # handle the error
result = subprocess.run(command_that_might_fail)  # like ['ls', 'abcd/']
if result.returncode != 0:
    # handle the error

在子進程中運行cd沒有任何用處。 子進程將更改自己的目錄,然后立即退出,不會在父進程或其他任何地方留下可觀察到的變化。

出於同樣的原因,大多數系統上都沒有名為cd的二進制命令。 cd命令是內置的 shell。

通常,如果您在沒有check=True關鍵字參數的情況下運行subprocess.run() ,則子進程中的任何錯誤都將被忽略。 所以如果/bin/cd或類似的命令存在,你可以運行

# purely theoretical, and utterly useless
subprocess.run(['cd', UserInput])

根本不知道它是否做了任何事情。

如果您確實提供了check=True ,那么您需要捕獲的異常是CalledProcessError

try:
    # pointless code as such; see explanation above
    subprocess.run(['cd', UserInput], check=True)
except subprocess.CalledProcessError:
    print('Directory name %s misspelled, or you lack the permissions' % UserInput)

但更根本的是,允許用戶通過在子進程中運行任意未經檢查的輸入來刺激系統是一個可怕的想法。 (允許用戶使用shell=True運行任意 shell 腳本是一個巨大的、災難性的可怕想法,所以我們甚至不要在那里 go 。也許看到shell=True in subprocess的實際含義

一種更安全的方法是使用cwd=關鍵字參數運行子進程。

# also vaguely pointless
subprocess.run(['true'], cwd=UserInput)

在這種情況下,如果目錄不存在,則可能會出現常規FileNotFoundError ,如果您缺乏權限,則會出現PermissionError

您可能仍應添加check=True並准備處理任何導致的異常,除非您特別不關心子流程是否成功。 (實際上在某些情況下這是有道理的,例如當您grep找到任何匹配項但沒有找到任何匹配項時很好,如果您使用check=True會引發錯誤。)

或許還可以參見在 Python 中運行 Bash 命令

您可以使用tryexpect塊來處理異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM