我知道这个问题已经被问了好几次,但是看不出我的用法有什么问题。
用法#1
proc = subprocess.Popen(['/usr/bin/find', '/path/to/dir', '-type', 'f', '-name', '"*.gradle"', '-exec', 'grep', '"KEYWORD"', '{}', '/dev/null', ';'], stdout=PIPE, stderr=PIPE)
output, error = proc.communicate()
Error: doesn't list any files.
用法#2
proc = subprocess.Popen(['/usr/bin/find', '/path/to/dir', '-type', 'f', '-name', '"*.gradle"', '-exec', 'grep', '"KEYWORD"', '{}', '/dev/null', '\\;'], stdout=PIPE, stderr=PIPE)
output, error = proc.communicate()
Error: find: -exec: no terminating ";" or "+"
使用#3
proc = subprocess.Popen(['/usr/bin/find', '/path/to/dir', '-type', 'f', '-name', '"*.gradle"', '-exec', 'grep', '"KEYWORD"', '{}', '/dev/null', '\;'], stdout=PIPE, stderr=PIPE)
output, error = proc.communicate()
Error: find: -exec: no terminating ";" or "+"
我可以使用shell = True选项获取命令。但是,希望避免将其作为最佳实践。
从shell运行时命令工作正常。
/usr/bin/find /path/to/dir -type f -name "*.gradle" -exec grep "KEYWORD" {} /dev/null \;
Python版本:2.7.11
OS X 10.11.3
感谢任何有关如何使其发挥作用的指示。
答案 0 :(得分:1)
当您将命令构建为与Popen
一起使用的列表时,您不需要使用shell转义,因此在这种情况下,\;
将被解释为字面反斜杠后跟分号虽然find
期望只看到一个分号作为单个参数。此外,"KEYWORD"
将包含引号,因此在没有引号的情况下找不到KEYWORD
。类似于"*.gradle"
,它只匹配用引号括起来的文件名。
proc = subprocess.Popen(['/usr/bin/find', '/path/to/dir', '-type', 'f',
'-name', '*.gradle', '-exec', 'grep', 'KEYWORD',
'{}', '/dev/null', ';'],
stdout=PIPE, stderr=PIPE)
答案 1 :(得分:0)
试试这个,
cmd='/usr/bin/find /path/to/dir -type f -name "*.gradle" -exec grep "KEYWORD" {} /dev/null \;'
proc = subprocess.Popen(cmd.split(), stdout=PIPE, stderr=PIPE)
output, error = proc.communicate()