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

这是我的 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是新的包吗?我怎样才能解决这个问题?

199184 次浏览

正确执行了您启动的命令 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))

名称中的单词 check_意味着如果命令(在本例中是 shell,返回最后一个命令的退出状态(在本例中是 yum))返回非零状态,那么它将引发 CalledProcessError异常。这是设计好的。如果要运行的命令在成功时可能返回非零状态,那么要么捕获此异常,要么不使用 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来运行您的问题中的命令。