【问题标题】:Python subprocess check_call: How to assign the non-0 exit code to a variable rather than raising an exception?Python子进程check_call:如何将非0退出代码分配给变量而不是引发异常?
【发布时间】:2021-02-04 10:18:22
【问题描述】:
output = subprocess.check_call('invented_command', shell=True)  # Returns 127

此代码引发异常(如手册中所述),将 127 而不是将 127 分配给“输出”变量,该变量仍未分配。仅当退出代码等于 0 时,才会设置“输出”变量。

【问题讨论】:

    标签: bash subprocess python-3.7


    【解决方案1】:

    check_call 的定义就是如果调用失败会抛出异常;这就是check 部分检查的内容。

    它的兄弟subprocess.call(),没有check,完全符合您的要求,并直接返回结果代码,并且一直可用到Python 2.4(当时subprocess 是介绍)。

    在 Python 3.5+ 中,您可以将 check_callcall(以及 check_output)替换为带有合适参数的 run。对于这种特定情况,它稍微复杂一些,但如果您需要的不仅仅是基础知识,那么它是编写自己的包装器的更好、更通用的起点。

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

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

    【讨论】:

    • 更多信息,请查看stackoverflow.com/questions/4256107/…
    • 我已经阅读了宏大的解释,因此,您能看到另一个问题吗? stackoverflow.com/questions/65952314这个问题不是网友声称的重复,不言自明。
    • 这个问题我已经很活跃了;如果多个 shell 命令都作为单个子进程调用,Python 无法知道哪个输出来自多个 shell 命令中的哪一个。
    • 即使 shell 仍在运行(使用 Popen)也不行?
    • 你怎么知道你收到的输出是来自两个命令echo "foo"; echo "bar"还是一个printf '%s\n' "foo" "bar"? (除了可能创建您自己的流程监视器和您的子流程作为其子流程。)
    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多