子进程 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的主要内容,如果未能解决你的问题,请参考以下文章
CalledProcessError:命令'['convert','--version']'返回非零退出状态1
Buildozer“命令'['ant','debug']'返回非零退出状态1”