子进程 check_output 返回非零退出状态 1

Posted

技术标签:

【中文标题】子进程 check_output 返回非零退出状态 1【英文标题】:Subprocess check_output returned non-zero exit status 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 是新的包?我怎么解决这个问题?

【问题讨论】:

【参考方案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 的想法,但对我来说仍然不是那么明显。我刚刚创建了一个问题:***.com/q/27938050/882697。你能看看吗?再次感谢您!

以上是关于子进程 check_output 返回非零退出状态 1的主要内容,如果未能解决你的问题,请参考以下文章

子进程命令Python的实时输出状态[重复]

CalledProcessError:命令'['convert','--version']'返回非零退出状态1

Python 子进程——如何忽略退出代码警告?

Buildozer“命令'['ant','debug']'返回非零退出状态1”

subprocess.CalledProcessError 返回非零退出状态 1

subprocess.CalledProcessError:返回非零退出状态 0