使用子进程在python中运行find命令

时间:2017-02-23 11:52:42

标签: python subprocess popen

我知道这个问题已经被问了好几次,但是看不出我的用法有什么问题。

用法#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

感谢任何有关如何使其发挥作用的指示。

2 个答案:

答案 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()