【发布时间】:2021-02-04 10:18:22
【问题描述】:
output = subprocess.check_call('invented_command', shell=True) # Returns 127
此代码引发异常(如手册中所述),将 127 而不是将 127 分配给“输出”变量,该变量仍未分配。仅当退出代码等于 0 时,才会设置“输出”变量。
【问题讨论】:
标签: bash subprocess python-3.7
output = subprocess.check_call('invented_command', shell=True) # Returns 127
此代码引发异常(如手册中所述),将 127 而不是将 127 分配给“输出”变量,该变量仍未分配。仅当退出代码等于 0 时,才会设置“输出”变量。
【问题讨论】:
标签: bash subprocess python-3.7
check_call 的定义就是如果调用失败会抛出异常;这就是check 部分检查的内容。
它的兄弟subprocess.call(),没有check,完全符合您的要求,并直接返回结果代码,并且一直可用到Python 2.4(当时subprocess 是介绍)。
在 Python 3.5+ 中,您可以将 check_call 和 call(以及 check_output)替换为带有合适参数的 run。对于这种特定情况,它稍微复杂一些,但如果您需要的不仅仅是基础知识,那么它是编写自己的包装器的更好、更通用的起点。
result = subprocess.run(['invented_command']) # check=True to enable check
status_code = result.returncode
还请注意我如何将包装器更改为avoid shell=True,这在这里似乎是多余的;如果您实际发明的命令出于某种原因确实需要 shell,显然取出命令周围的 [...] 并添加回讨厌的 shell=True(或者,更好的是,找到一种通过其他方式避免它的方法)。
【讨论】:
echo "foo"; echo "bar"还是一个printf '%s\n' "foo" "bar"? (除了可能创建您自己的流程监视器和您的子流程作为其子流程。)