【问题标题】:Subprocess check_output returned non-zero exit status 1子进程 check_output 返回非零退出状态 1
【发布时间】:2015-03-11 07:57:57
【问题描述】:

这是我的python代码:

import subprocess
subprocess.check_output("ls",shell=True,stderr=subprocess.STDOUT)

import subprocess
subprocess.check_output("yum",shell=True,stderr=subprocess.STDOUT)

第一个 .check_output() 运行良好,但第二个返回:

Traceback (most recent call last):
File "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole/console.py", line 378, in __run
r = eval(command, self.namespace, self.namespace)
File "<string>", line 1, in <module>
File "/usr/lib/python3.4/subprocess.py", line 616, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command 'yum' returned non-zero exit status 1

为什么会这样?是不是因为ls 是原来的shell 命令,而yum 是新的包?我怎么解决这个问题?

【问题讨论】:

    标签: python python-3.x subprocess


    【解决方案1】:

    您启动的命令yum 已正确执行。它返回一个非零状态,这意味着在命令处理过程中发生了错误。您可能想在 yum 命令中添加一些参数来解决这个问题。

    您的代码可能会以这种方式显示此错误:

    import subprocess
    try:
        subprocess.check_output("dir /f",shell=True,stderr=subprocess.STDOUT)
    except subprocess.CalledProcessError as e:
        raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
    

    【讨论】:

    • 所以如果我只想在 python 中实现命令 (g3-from-scratch.csh tpall.fna from-scratch)。此命令将在当前目录中创建一些文件,但在控制台中不回复,我在 shell 中测试此命令,它可以工作。我如何在 python 中实现它?最初,我使用 os.system(),但它只是返回 (sh: 1: g3-from-scratch.csh: not found)
    • 我尝试了你的 yum 代码,它运行良好,但不适用于 g3-from-scratch.csh。我不知道它们有什么不同,我可以直接在控制台中使用它们。
    • 如果不使用捕获的输出,为什么还要使用check_output()
    • 最后,我解决了问题,我应该在g3-from-scratch.csh前面添加abs路径,因为我的环境路径是相对路径(~/software/glimmer3.02)但它应该写(/home/username/software/glimmer3.02)。
    • 投反对票:这是一个笨拙的解决方法。如果您实际上不希望 Python 检查退出代码并在它不为零时引发错误,请不要调用 check_output()。有关详细信息和更好的方法,请参阅jfs' anser elsewhere on this page
    【解决方案2】:

    名称中的单词check_ 表示如果命令(在这种情况下是返回最后一个命令的退出状态的shell(在这种情况下是yum))返回非零状态,那么它会引发@987654324 @ 例外。这是设计使然。如果您要运行的命令可能在成功时返回非零状态,则要么捕获此异常,要么不使用 check_ 方法。您可以在您的情况下使用subprocess.call,因为您忽略了捕获的输出,例如:

    import subprocess
    
    rc = subprocess.call(['grep', 'pattern', 'file'],
                         stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
    if rc == 0: # found
       ...
    elif rc == 1: # not found
       ...
    elif rc > 1: # error
       ...
    

    您不需要shell=True 来运行您问题中的命令。

    【讨论】:

    • 所以无论如何你都要检查subprocess.call之后的返回码。除了具有无效返回码的命令场景之外,是否存在应该使用call 而不是check_output 的真实情况?谢谢!
    • 只有在特殊情况下才应该提出例外(有例外,但一般规则成立)。如果您希望grep 返回1(如果它不是您的应用程序中的错误),那么您不应该引发异常。检查退出状态以找出是否在文件中找到模式:这是首先运行子进程的重点。另外,你不应该使用check_output(),除非你使用它的返回值(子进程的输出)
    • 感谢您的解释。我理解grep 的想法,但对我来说仍然不是那么明显。我刚刚创建了一个问题:stackoverflow.com/q/27938050/882697。你能看看吗?再次感谢您!
    猜你喜欢
    • 2017-03-19
    • 2020-10-24
    • 1970-01-01
    • 2014-09-23
    • 2012-01-17
    • 2014-01-13
    • 2019-10-02
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多