Python 子进程 check_call:如何将非 0 退出代码分配给变量而不是引发异常?
Python subprocess check_call: How to assign the non-0 exit code to a variable rather than raising an exception?
output = subprocess.check_call('invented_command', shell=True) # Returns 127
此代码引发了 127 的异常(如手册中所述),而不是将 127 分配给“输出”变量,该变量仍未分配。仅当退出代码等于 0 时,才会设置“输出”变量。
check_call
的定义是,如果调用失败,它将引发异常;这就是 check
部分检查的内容。
它的同级 subprocess.call()
,没有 check
,但它完全符合您的要求,并且 returns 直接返回结果代码,并且可以一直返回到Python 2.4(引入 subprocess
时)。
在 Python 3.5+ 中,您可以使用具有合适参数的 run
替换 check_call
和 call
(以及 check_output
)。对于这个特定的案例,它稍微复杂一些,但如果您需要的不仅仅是基础知识,那么它是编写您自己的包装器的更好、更通用的起点。
result = subprocess.run(['invented_command']) # check=True to enable check
status_code = result.returncode
另请注意我是如何将包装器更改为 avoid shell=True
的,这在这里似乎是多余的;如果你实际发明的命令出于某种原因确实需要 shell,显然去掉命令周围的 [...]
并添加回讨厌的 shell=True
(或者,更好的是,找到避免的方法通过其他方式)。
output = subprocess.check_call('invented_command', shell=True) # Returns 127
此代码引发了 127 的异常(如手册中所述),而不是将 127 分配给“输出”变量,该变量仍未分配。仅当退出代码等于 0 时,才会设置“输出”变量。
check_call
的定义是,如果调用失败,它将引发异常;这就是 check
部分检查的内容。
它的同级 subprocess.call()
,没有 check
,但它完全符合您的要求,并且 returns 直接返回结果代码,并且可以一直返回到Python 2.4(引入 subprocess
时)。
在 Python 3.5+ 中,您可以使用具有合适参数的 run
替换 check_call
和 call
(以及 check_output
)。对于这个特定的案例,它稍微复杂一些,但如果您需要的不仅仅是基础知识,那么它是编写您自己的包装器的更好、更通用的起点。
result = subprocess.run(['invented_command']) # check=True to enable check
status_code = result.returncode
另请注意我是如何将包装器更改为 avoid shell=True
的,这在这里似乎是多余的;如果你实际发明的命令出于某种原因确实需要 shell,显然去掉命令周围的 [...]
并添加回讨厌的 shell=True
(或者,更好的是,找到避免的方法通过其他方式)。