【问题标题】:subprocess.CalledProcessError: what *is* the error?subprocess.CalledProcessError: 什么*是*错误?
【发布时间】:2017-01-26 14:09:58
【问题描述】:
import subprocess

cmd = "grep -r * | grep jquery"
print cmd

subprocess.check_output(cmd, shell=True)

subprocess.CalledProcessError: 命令'grep -r * | grep jquery' 返回非零退出状态 1

我可以在我的 shell 中毫无问题地执行该命令。如何查看python中的实际错误?

sn-p 是一个更大的脚本的一部分,它接受多个参数并链接 grep 命令 + 添加一些排除项(我不需要 grep 日志文件或缩小的 JavaScript。因此是迂腐的语法。 em>

Python 2.7.10

【问题讨论】:

  • 这只是意味着该命令返回了一个非零退出代码...这正是 grep 在匹配失败时所做的。
  • 啊啊!你的意思是没有结果?
  • 也许我对您的 grep 命令有误解,但您是否在路径中寻找 jquery?为什么不只是grep -r jquery .
  • 顺便说一句,grep -r * 在目录中的所有其他文件中查找目录中第一个文件的名称。我无法想象在什么情况下这是正确的行为。
  • 感谢您的澄清!很好,我问了 :-) 我已将其更改为 grep -r jquery .

标签: python subprocess


【解决方案1】:

Quoting docs:

如果返回码非零,则会引发CalledProcessError。这 CalledProcessError 对象将在 returncode 中具有返回码 属性和output 属性中的任何输出。

import subprocess

cmd = "grep -r * | grep jquery"
print cmd

try:
    subprocess.check_output(cmd, shell=True)
except subprocess.CalledProcessError as e:
    print e.returncode
    print e.output

错误信息被打印到stderr,你需要关键字参数stderr=subprocess.STDOUT

除了返回码和标准输出/标准错误之外,没有其他“出了什么问题”的来源。

【讨论】:

  • e.output 在这种情况下无济于事,因为它是空的(即使使用 stderr=subprocess.STDOUT),但在其他情况下可能会有所帮助。谢谢。
  • 没有其他来源可以检索该信息。对于简单的工具,存在具有相关含义的有限非零返回码。对于复杂的工具,需要解析输出(或者确切的错误原因不明确)。
【解决方案2】:

“非零退出状态”表示您运行的命令指示了非成功状态。对于grep,文档明确指出退出状态为 1 表示未找到任何行,而退出状态大于 1 表示发生了其他错误。

引用手册:

退出状态 - grep 实用程序以下列值之一退出:

0     One or more lines were selected.
1     No lines were selected.
>1    An error occurred.

顺便说一句——如果要在当前目录下的所有文件中(递归)查找字符串jquery,请使用grep -r jquery .grep -r *您目录中所有其他文件的内容中搜索您目录中第一个文件的名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2012-06-08
    • 2015-03-28
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多