![](/img/trans.png)
[英]How to know what the error is when I use subprocess.run() in python with exception?
[英]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 命令
您可以使用try
和expect
塊來處理異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.