2012-07-11 139 views
0

我想在python中編寫一個svn pre-commit鉤子。其中一部分涉及檢查diff文件以查看是否有任何實際的文件更改(而不僅僅是屬性更改)。避免subprocess.Popen自動轉義grep我的反斜槓

我有一個工作grep命令,我可以在外殼

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

然而,當我把它通過subprocess.POpen它避開了我所有的反斜線,這knackers正則表達式執行罰款。

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

你使用'shell = True'嗎?你能發佈失敗的代碼嗎? – ecatmur 2012-07-11 12:01:44

+0

命令列表的第二個元素不是有效的Python字符串。請張貼實際的代碼。 – 2012-07-11 12:20:12

回答

3

你需要考慮你想要grep在其命令行參數看什麼。

的第一個參數必須是文字字符串"^\(Added: \|Modified: \|Deleted: \)",這樣就意味着它不應包括雙引號,但應該包括反斜線。

來表達這種字符串的方法是使用Python原始字符串:

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

一個很好的方法來檢查你實際上運行的是echo更換grep這樣你至少可以看到什麼你傳遞給命令。

+0

解決了它。非常感謝你的幫助。我不知道原始字符串。 Python新手。有關回聲的有用提示也是如此。 – JamesT 2012-07-11 13:08:03