Python Popen grep

2024-05-01

我希望 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(使用前将#替换为@)

Python Popen grep 的相关文章

随机推荐