我希望Popen执行:
grep -i --line-buffered "grave" data/*.txt
Run Code Online (Sandbox Code Playgroud)
从shell运行时,这给了我想要的结果.如果我开始,在我测试的同一个目录中grep,一个python repl并按照文档中的说明,我获得了应该为Popen提供的正确参数列表:
['grep', '-i', '--line-buffered', 'grave', 'data/*.txt']
Run Code Online (Sandbox Code Playgroud)
结果p = subprocess.Popen(args)是
grep: data/*.txt: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果我尝试p = subprocess.Popen(args, shell=True),我得到:
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
Run Code Online (Sandbox Code Playgroud)
有关如何执行所需流程的任何帮助?我在MacOS Lion上.
Rob*_*ers 10
如果键入*bash,shell会在执行命令之前将其扩展为给定目录中的文件.Python的POPEN确实没有这样的东西,所以你在做什么,当你拨打POPEN这样告诉grep的还有一个名为*.txt的data目录,而不是所有.txt的文件data目录.该文件不存在,您得到预期的错误.
要解决这个问题,你可以通过传递shell=True给Popen 告诉python通过shell运行命令:
subprocess.Popen('grep -i --line-buffered grave data/*.txt', shell=True)
Run Code Online (Sandbox Code Playgroud)
哪个被翻译成:
subprocess.Popen(['/bin/sh', '-c', 'grep -i --line-buffered "grave" data/*.txt'])
Run Code Online (Sandbox Code Playgroud)
正如文档中Popen所解释的那样.
你必须在这里使用一个字符串而不是一个列表,因为你想要执行/bin/sh -c "grep -i --line-buffered "grave" data/*.txt"(命令周围的NB引号,使它成为一个参数sh).如果你使用一个列表这个命令运行:/bin/sh -c grep -i --line-buffered "grave" data/*.txt,它给你简单运行的输出grep.