我之前使用过的子进程没有任何问题,出于某种原因我尝试使用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的答案以获得解释
答案 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期望将模式作为必需参数。