Subprocess.check_output与grep:退出状态2

4 投票
3 回答
17157 浏览
提问于 2025-04-18 05:05

我之前用过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的回答,里面有解释。

3 个回答

0

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

注意:不要使用 shell=True,也不要在引号里面再加引号。

grep 如果出错会返回状态码 2。在这种情况下,你问题中的原始代码就相当于在没有任何参数的情况下调用 grep,这是不对的:因为 grep 需要一个模式作为必填参数。

0

你可以试着从标准错误流中读取信息,看看哪里出了问题。你也可以直接使用call()函数,读取标准输出的内容,这样就可以忽略返回的状态码了。

6

你在使用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'])

也应该可以正常工作。

撰写回答