我想让Popen执行:
grep -i --line-buffered "grave" data/*.txt当从shell运行时,这会给我想要的结果。如果我开始,在我测试grep的同一目录下,一个python repl并遵循the instruction from the docs,我获得了应该是正确的参数列表,以便提供给Popen:
['grep', '-i', '--line-buffered', 'grave', 'data/*.txt']p = subprocess.Popen(args)的结果是
grep: data/*.txt: No such file or directory如果我尝试使用p = subprocess.Popen(args, shell=True),我会得到:
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.有关于如何执行想要的过程的帮助吗?我在MacOS Lion上
发布于 2012-01-24 02:43:58
如果您在bash中键入*,那么在执行命令之前,shell会将其展开到给定目录中的文件。Python的Popen不做这样的事情,所以当您像这样调用Popen时,您要做的是告诉grep在data目录中有一个名为*.txt的文件,而不是data目录中的所有.txt文件。该文件不存在,您会得到预期的错误。
要解决此问题,您可以通过将shell=True传递给Popen来告诉python通过shell运行该命令:
subprocess.Popen('grep -i --line-buffered grave data/*.txt', shell=True)它被翻译成:
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的输出。
发布于 2012-01-24 02:44:43
问题是shell会为您创建文件globbing : data/*.txt
你需要自己去做,例如,使用glob模块。
import glob
cmd_line = ['grep', '-i', '--line-buffered', 'grave'] + glob.glob('data/*.txt')https://stackoverflow.com/questions/8976781
复制相似问题