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

时间:2015-01-13 11:14:09

标签: python python-3.x subprocess

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

3 个答案:

答案 0 :(得分:33)

您启动的命令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))

答案 1 :(得分:10)

名称中的单词check_表示如果命令(在这种情况下返回最后一个命令(在这种情况下为yum)的退出状态的shell)返回非零状态,则它引发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来运行问题中的命令。

答案 2 :(得分:-3)

对于 Windows 用户: 尝试从 Windows\System32 中删除文件:java.exe、javaw.exe 和 javaws.exe

我的问题是安装了 Java 1.7 版。