首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Popen grep

Python Popen grep
EN

Stack Overflow用户
提问于 2012-01-24 02:35:59
回答 2查看 9K关注 0票数 6

我想让Popen执行:

代码语言:javascript
复制
grep -i --line-buffered "grave" data/*.txt

当从shell运行时,这会给我想要的结果。如果我开始,在我测试grep的同一目录下,一个python repl并遵循the instruction from the docs,我获得了应该是正确的参数列表,以便提供给Popen:

代码语言:javascript
复制
['grep', '-i', '--line-buffered', 'grave', 'data/*.txt']

p = subprocess.Popen(args)的结果是

代码语言:javascript
复制
grep: data/*.txt: No such file or directory

如果我尝试使用p = subprocess.Popen(args, shell=True),我会得到:

代码语言:javascript
复制
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

有关于如何执行想要的过程的帮助吗?我在MacOS Lion上

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-24 02:43:58

如果您在bash中键入*,那么在执行命令之前,shell会将其展开到给定目录中的文件。Python的Popen不做这样的事情,所以当您像这样调用Popen时,您要做的是告诉grep在data目录中有一个名为*.txt的文件,而不是data目录中的所有.txt文件。该文件不存在,您会得到预期的错误。

要解决此问题,您可以通过将shell=True传递给Popen来告诉python通过shell运行该命令:

代码语言:javascript
复制
subprocess.Popen('grep -i --line-buffered grave data/*.txt', shell=True)

它被翻译成:

代码语言:javascript
复制
subprocess.Popen(['/bin/sh', '-c', 'grep -i --line-buffered "grave" data/*.txt'])

the documentation of Popen中所述。

在这里,您必须使用字符串而不是列表,因为您希望执行/bin/sh -c "grep -i --line-buffered "grave" data/*.txt" (注意:在命令两边加上引号,使其成为sh的单个参数)。如果使用列表,则此命令将运行:/bin/sh -c grep -i --line-buffered "grave" data/*.txt,它会给出简单运行grep的输出。

票数 11
EN

Stack Overflow用户

发布于 2012-01-24 02:44:43

问题是shell会为您创建文件globbing : data/*.txt

你需要自己去做,例如,使用glob模块。

代码语言:javascript
复制
import glob
cmd_line = ['grep', '-i', '--line-buffered', 'grave'] + glob.glob('data/*.txt')
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8976781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档