Subprocess.check_output与grep:退出状态2
我之前用过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'])
也应该可以正常工作。