我通过python脚本调用grep,并将输出存储到一个列表中。我只想grep
搜索具有特定文件扩展名的文件,即.c、.cpp和.h。我使用的是函数subprocess.check_output()
(格雷普)_图案.py)地址:
#!/usr/bin/env python
import subprocess
grep_str = subprocess.check_output(['grep', 'rl', '--include=*.{c,cpp,h}', 'pattern', '.'])
print grep_str
我给grep打电话的时候代码很好用_图案.py来自同一目录,即./grep_pattern
或其上方的任何目录,如./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}'
选项,那么无论从何处调用代码,代码都可以工作。你知道吗
花括号不是模式匹配语法的一部分,
grep
的include
和exclude
参数不处理它们。相反,它们是对shell的指令,用来创建它们所在的参数/单词的几个变体。你在这里没有外壳,所以没有什么是遵守这些指示。你知道吗展开它们可能如下所示:
完成此操作后,
include
模式实际上将能够匹配磁盘上存在的文件名,这样您的grep
调用就可以成功地找到模式的匹配项,此时它可以返回一个成功的结果。你知道吗顺便说一下,异常中给出的路径末尾的
\n
有点危险。除非实际上有一个以文字换行符结尾的目录名(这是可能的,但很少),否则请确保在从readline()
或类似文件接收时正确地剥离尾部的换行符。你知道吗相关问题 更多 >
编程相关推荐