0

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

我有一个可以在 shell 上正常执行的 grep 命令

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

但是,当我通过 subprocess.POpen 将其转义时,它会转义我所有的反斜杠,这会破坏正则表达式。

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

我该如何避免这种情况?

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

NB2:我也尝试使用 filterdiff --clean 代替,但无法正常工作。搜索已添加、已修改或已删除的行,删除带有 'svn:' 的行并检查我有一些结果似乎可行。

Python代码:

command = ['grep', '"^\(Added: \|Modified: \|Deleted: \)"', filename]
sys.stdout.write('Executing command: %s\n' % (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)
4

1 回答 1

3

您需要考虑您希望grep在其命令行参数中看到的内容。

第一个参数必须是文字 string "^\(Added: \|Modified: \|Deleted: \)",这意味着它不应包含双引号,而包含反斜杠。

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

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

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

于 2012-07-11T12:30:54.443 回答