我通过python脚本调用grep,并将输出存储到列表中。我只希望grep
搜索具有特定文件扩展名的文件,即.c,.cpp和.h。我正在使用函数subprocess.check_output()
(grep_pattern.py):
#!/usr/bin/env python
import subprocess
grep_str = subprocess.check_output(['grep', 'rl', '--include=*.{c,cpp,h}', 'pattern', '.'])
print grep_str
当我从同一目录(即./grep_pattern
)或从其上方的任何目录调用grep_pattern.py时,代码工作正常,例如./scripts/python/grep_pattern.py
或./python/grep_pattern.py
。但是,如果我从它下面的任何目录中调用它,代码将返回以下错误,例如../grep_pattern.py
或../../grep_pattern.py
File "./grep_include.py", line 7, in <module>
ls_output_str = subprocess.check_output(['grep', '-rl', '--include=*.{c,cpp,h}', 'pattern', '.'])
File "/<path>/lib/python2.7/subprocess.py", line 575, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['grep', '-rl', '--include=*.{c,cpp,h}', 'pattern', '/projects/<path>/APACHE\n']' returned non-zero exit status 1
奇怪的是,如果删除'--include=*.{c,cpp,h}'
选项,代码无论在何处调用都可以正常工作。
答案 0 :(得分:2)
大括号不是模式匹配语法的一部分,grep
的{{1}}和--include
参数不处理它们。相反,它们是一个指令到shell 来创建它们存在的参数/单词的几个变体。你这里没有shell,所以没有任何东西可以遵守这些说明。
将它们展开可能如下所示:
--exclude
完成此操作后,grep_str = subprocess.check_output(
['grep', '-rl',
'--include=*.c',
'--include=*.cpp',
'--include=*.h',
'pattern', '.'])
模式实际上可以匹配磁盘上存在的文件名,这样您的--include
调用可能能够成功找到模式的匹配项,它可以返回成功的结果。
顺便说一下 - 你的异常中给出的路径末尾的grep
有点红旗。除非你实际上的目录名以文字换行符结尾(这是可能的,但很少见),否则请确保从\n
或类似时间收到正确删除尾随换行符。