Python 避免子进程。在grep中Popen自动转义我的反斜杠

Python 避免子进程。在grep中Popen自动转义我的反斜杠,python,svn,grep,diff,Python,Svn,Grep,Diff,我正在尝试用python编写一个svn预提交钩子。其中一部分涉及检查diff文件,以查看是否有任何实际的文件更改(而不仅仅是属性更改) 我有一个工作grep命令,我可以在shell上很好地执行它 grep "^\(Added: \|Modified: \|Deleted: \)" diff filename | grep -v 'svn:' 然而,当我将它放入subprocess.POpen时,它会逃过我所有的反斜杠,这会使regexp变得很糟糕 Executing command: ['gr

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

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

grep "^\(Added: \|Modified: \|Deleted: \)" diff filename | grep -v 'svn:'
然而,当我将它放入subprocess.POpen时,它会逃过我所有的反斜杠,这会使regexp变得很糟糕

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)

您需要考虑您想要的代码<代码> GRP<代码>,以查看其命令行参数。

第一个参数必须是文本字符串
“^\(添加:\\\修改:\\删除:\)”
,这意味着它不应该包含双引号,而应该包含反斜杠

表示此类字符串的方法是使用Python原始字符串:

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

<> P>一个检查你实际运行的好方法是用<代码> Egule<代码>替换<代码> GRP<代码>,这样你至少可以看到你传递给命令的内容。

< P>你需要考虑你想要的代码<代码> GRP<代码>在它的命令行参数中看到。

第一个参数必须是文本字符串
“^\(添加:\\\修改:\\删除:\)”
,这意味着它不应该包含双引号,而应该包含反斜杠

表示此类字符串的方法是使用Python原始字符串:

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

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

是否使用
shell=True
?可以发布失败的代码吗?命令列表的第二个元素不是有效的Python字符串。请发布实际代码。您是否使用
shell=True
?可以发布失败的代码吗?命令列表的第二个元素不是有效的Python字符串。请发布实际代码。这就解决了问题。非常感谢你的帮助。我不知道原始弦。Python新手。关于回声的有用提示。这就解决了它。非常感谢你的帮助。我不知道原始弦。Python新手。关于回声的有用提示。