【问题标题】:Subprocess.check_output with grep: exit-status 2Subprocess.check_output 与 grep:退出状态 2
【发布时间】:2014-06-18 16:09:19
【问题描述】:

我之前使用过 subprocess 没有任何问题,由于某种原因,当我使用 grep 尝试它时:

grepOut = subprocess.check_output("grep 'hello' tmp", shell=True)

我收到以下错误:

File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['grep', "'hello'", 'tmp']' returned non-zero exit status 2

直接在终端中输入命令没有任何错误。

编辑:请参阅 clemej 的答案以获得解释

【问题讨论】:

  • 退出状态 1 != 退出状态 2。退出状态 1 表示没有找到字符串。退出状态 2 表示错误。
  • @clemej 我很抱歉,意识到当你发表评论时,给你答案!
  • 不要更改问题中的代码。现在错误信息不再对应于代码。您的代码中的一个问题是(如@clemej pointed out)列表参数的使用与shell=True 一起改变了参数的含义。

标签: python linux subprocess


【解决方案1】:

正确的命令是:out = subprocess.check_output(['grep', 'hello', 'tmp'])

注意:没有shell=True,引号内没有引号。

grep 如果发生错误,则返回退出状态 2。在这种情况下,您问题中的原始代码相当于在没有任何不正确参数的情况下调用 grep:grep 需要一个模式作为强制参数。

【讨论】:

    【解决方案2】:

    当 shell=True 时,您使用了错误的参数。

    https://docs.python.org/2/library/subprocess.html

    当您使用 shell=True 时,第一个参数不是字符串参数列表,而是作为字符串的命令:

    grepOut = subprocess.check_output("grep 'hello' tmp", shell=True)
    

    应该可以。

    只需要在不指定shell=True的情况下使用列表形式,所以可选:

    grepOut = subprocess.check_output(['grep', "'hello'", 'tmp'])
    

    应该也可以。

    【讨论】:

    • 对不起,我真的试过了,忘了说。 grepOut = subprocess.check_output("grep 'hello' tmp", shell=True) 给了我同样的错误。不过,没有其他终端命令给我这个问题。
    • 编辑了主要问题,以反映使用您提出的解决方案我仍然遇到该问题
    • 你确定吗?因为当我将您的测试剪切粘贴到我的 python2.7 安装中时(在通过 'echo "hello" > tmp' 创建文件 tmp 之后), subprocess.check_output("grep 'hello' tmp", shell=True) 有效,但原来的方式没有。
    • 您已经更改了问题,现在您的退出状态为 1。这是非常不同的。这意味着它无法在文件中找到字符串 hello。
    【解决方案3】:

    您可以尝试的一件事是从标准错误流中读取,看看出了什么问题。您也可以只使用 call() 并从标准输出读取输出,从而忽略返回码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-10
      • 2018-09-18
      • 2013-02-28
      • 2018-02-03
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多