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_callcall(以及 check_output)。对于这个特定的案例,它稍微复杂一些,但如果您需要的不仅仅是基础知识,那么它是编写您自己的包装器的更好、更通用的起点。

result = subprocess.run(['invented_command'])  # check=True to enable check
status_code = result.returncode

另请注意我是如何将包装器更改为 avoid shell=True 的,这在这里似乎是多余的;如果你实际发明的命令出于某种原因确实需要 shell,显然去掉命令周围的 [...] 并添加回讨厌的 shell=True(或者,更好的是,找到避免的方法通过其他方式)。