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

时间:2012-07-11 11:57:48

标签: python svn grep diff

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

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

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

然而,当我把它放到subprocess.POpen时,它会逃脱我所有的反斜杠,这会使正则表达式变得更糟。

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

我该如何避免这种情况?

注意:我知道我可以在子进程之间管道结果,我可以这样做两个greps。我需要帮助让第一个首先工作:/

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)

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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