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

2024-03-29 11:10:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过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}'选项,那么无论从何处调用代码,代码都可以工作。你知道吗


Tags: 文件代码py目录outputincludecheckgrep
1条回答
网友
1楼 · 发布于 2024-03-29 11:10:46

花括号不是模式匹配语法的一部分,grep include exclude参数不处理它们。相反,它们是对shell的指令,用来创建它们所在的参数/单词的几个变体。你在这里没有外壳,所以没有什么是遵守这些指示。你知道吗

展开它们可能如下所示:

grep_str = subprocess.check_output(
    ['grep', '-rl',
     ' include=*.c',
     ' include=*.cpp',
     ' include=*.h',
     'pattern', '.'])

完成此操作后, include模式实际上将能够匹配磁盘上存在的文件名,这样您的grep调用就可以成功地找到模式的匹配项,此时它可以返回一个成功的结果。你知道吗


顺便说一下,异常中给出的路径末尾的\n有点危险。除非实际上有一个以文字换行符结尾的目录名(这是可能的,但很少),否则请确保在从readline()或类似文件接收时正确地剥离尾部的换行符。你知道吗

相关问题 更多 >