从子目录调用python脚本(使用子进程调用grep)会导致错误

时间:2017-03-14 22:12:58

标签: python python-2.7

我通过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}'选项,代码无论在何处调用都可以正常工作。

1 个答案:

答案 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或类似时间收到正确删除尾随换行符。