我正在尝试在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)
答案 0 :(得分:3)
您需要考虑您希望grep
在其命令行参数中看到的内容。
第一个参数必须是文字字符串"^\(Added: \|Modified: \|Deleted: \)"
,这意味着它不应该包含双引号但应该包含反斜杠。
表达这种字符串的方法是使用Python原始字符串:
command = ['grep', r'^\(Added: \|Modified: \|Deleted: \)', filename]
检查您实际运行的内容的一个好方法是将grep
替换为echo
,这样您至少可以看到您传递给命令的内容。