2014-05-02 67 views
3

我以前用过的子进程没有任何问题,因为某些原因,当我使用grep试试吧:Subprocess.check_output使用grep:退出状态2

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

退出状态1!=退出状态2.退出状态1表示找不到字符串。退出状态2意味着错误。 – clemej

+0

@clemej我的歉意,意识到当你发表评论,给你答案! – Juicy

+0

哈哈,别担心! – clemej

回答

4

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

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

当你使用shell =真,第一个参数是不是字符串参数列表,但该命令作为一个字符串:

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

应该工作。

你只需要使用列表形式时不指定壳=真,那么也可以使用:

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

也应该工作。

+0

对不起,我已经尝试过,忘了提。 ** grepOut = subprocess.check_output(“grep'hello'tmp”,shell = True)**给我同样的错误。虽然没有其他终端命令给我这个问题。 – Juicy

+0

编辑的主要问题,以反映我仍然有问题,使用您提出的解决方案 – Juicy

+0

你是积极的吗?因为当我将你的测试剪切粘贴到我的python2.7安装(通过'echo“hello”> tmp'创建文件tmp后),subprocess.check_output(“grep'hello'tmp”,shell = True) ,但原来的方式没有。 – clemej

0

有一两件事你可以尝试从标准错误流中读取,看看什么错误。您也可以使用call()并从stdout读取输出,从而忽略返回码。

0

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

说明:否shell=True,引号内没有引号。

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