使用grep:exit-status 2的Subprocess.check_output

时间:2014-05-02 03:27:37

标签: python linux 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 :(得分: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'])

也应该有用。

答案 1 :(得分:0)

您可以尝试的一件事是从标准错误流中读取以查看出错的地方。您也可以使用call()并从stdout读取输出,从而忽略返回代码。

答案 2 :(得分:0)

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

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

如果发生错误,

grep将返回退出状态2。在这种情况下,您的问题中的原始代码等同于调用grep而没有任何不正确的参数:grep期望将模式作为必需参数。