我希望 Popen 执行:
grep -i --line-buffered "grave" data/*.txt
当从 shell 运行时,这给了我想要的结果。如果我开始,在我测试的同一目录中grep
,一个 python repl 并遵循文档中的说明 http://docs.python.org/library/subprocess.html#popen-constructor,我获得了应该为 Popen 提供的正确参数列表:
['grep', '-i', '--line-buffered', 'grave', 'data/*.txt']
的结果p = subprocess.Popen(args)
is
grep: data/*.txt: No such file or directory
如果我尝试p = subprocess.Popen(args, shell=True)
, I get:
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
关于如何执行所需的过程有任何帮助吗?我使用的是 MacOS Lion。
如果您输入*
在 bash 中,shell 在执行命令之前将其扩展为给定目录中的文件。 Python 的 Popen 没有做这样的事情,所以当你像这样调用 Popen 时你所做的就是告诉 grep 有一个名为*.txt
in the data
目录,而不是所有.txt
文件在data
目录。该文件不存在,您会收到预期的错误。
要解决这个问题,你可以告诉 python 通过 shell 运行命令shell=True
致波彭:
subprocess.Popen('grep -i --line-buffered grave data/*.txt', shell=True)
这被翻译成:
subprocess.Popen(['/bin/sh', '-c', 'grep -i --line-buffered "grave" data/*.txt'])
正如中所解释的的文档Popen http://docs.python.org/library/subprocess.html#popen-constructor.
这里必须使用字符串而不是列表,因为你要执行/bin/sh -c "grep -i --line-buffered "grave" data/*.txt"
(注意,命令周围有引号,使其成为一个参数sh
)。如果您使用列表,则运行此命令:/bin/sh -c grep -i --line-buffered "grave" data/*.txt
,这为您提供了简单运行的输出grep
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)