避免子流程.Popen在grep中自动转义我的反斜杠



我正在尝试用python编写一个svn预提交钩子。其中一部分涉及检查diff文件,看看是否有任何实际的文件更改(而不仅仅是属性更改)。

我有一个正在工作的grep命令,我可以在shell 上很好地执行它

grep "^(Added: |Modified: |Deleted: )" diff filename | grep -v 'svn:'

然而,当我把它通过子流程时。POpen它转义了我所有的反斜杠,这会破坏正则表达式。

Executing command: ['grep', '"^\Added: \|Modified: \|Deleted: \)", ...]

我该如何避免这种情况?

注意:我知道我可以在子流程之间传输结果,并且我可以用这种方式完成两个grep。不过,我需要帮助让第一个先工作:/

NB2:我也尝试过使用filterdiff——clean,但无法使其工作。搜索添加的、修改的或删除的行,删除那些带有"svn:"的行,并检查我是否有一些结果,似乎是可行的。

Python代码:

command = ['grep', '"^(Added: |Modified: |Deleted: )"', filename]
sys.stdout.write('Executing command: %sn' % (command))
p = subprocess.Popen(command,
stdin = subprocess.PIPE
stdout = subprocess.PIPE
stderr = subprocess.STDOUT
shell = True)
data = p.stdout.read()
if len(data) == 0:
    sys.stdout.write("Diff does not contain any file modifications./n")
    exit(0)

您需要考虑您希望grep在其命令行参数中看到什么。

第一个参数需要是文字字符串"^(Added: |Modified: |Deleted: )",这意味着它不应该包含双引号,但应该包含反斜杠。

表达这种字符串的方法是使用Python原始字符串:

command = ['grep', r'^(Added: |Modified: |Deleted: )', filename]

检查实际运行的内容的一个好方法是用echo替换grep,这样您至少可以看到传递给命令的内容。

最新更新