2012-01-23 32 views
4

我想POPEN執行:Python的POPEN的grep

grep -i --line-buffered "grave" data/*.txt 

當從shell中運行,這給了我想要的結果。如果我開始,在我測試grep,蟒蛇REPL並按照the instruction from the docs非常相同的目錄,我得到什麼應該是正確的參數列表與飼料POPEN:

['grep', '-i', '--line-buffered', 'grave', 'data/*.txt'] 

p = subprocess.Popen(args)結果是

grep: data/*.txt: No such file or directory 

如果我嘗試p = subprocess.Popen(args, shell=True),我得到:

Usage: grep [OPTION]... PATTERN [FILE]... 
Try `grep --help' for more information. 

如何進行通緝過程中任何幫助嗎?我在MacOS Lion上。

回答

7

如果您在bash鍵入*外殼擴展它在給定目錄中的文件執行命令前。 Python的POPEN確實沒有這樣的東西,所以你在做什麼,當你撥打POPEN這樣告訴grep的有一個叫於data目錄*.txt文件,而不是所有的data目錄.txt文件。該文件不存在,你會得到預期的錯誤。

通過傳遞shell=True到POPEN解決這個問題,你可以告訴巨蟒通過shell運行命令:

subprocess.Popen('grep -i --line-buffered grave data/*.txt', shell=True) 

它得到翻譯爲:

subprocess.Popen(['/bin/sh', '-c', 'grep -i --line-buffered "grave" data/*.txt']) 

正如the documentation of Popen解釋。

因爲要執行/bin/sh -c "grep -i --line-buffered "grave" data/*.txt"(N.B.引號圍繞命令,使其成爲sh的單個參數),您必須在此處使用字符串而不是列表。如果您使用運行此命令的列表:/bin/sh -c grep -i --line-buffered "grave" data/*.txt,它給你的只是運行grep輸出。

4

的問題是,外殼使得文件尋找適合你:數據/ * TXT

你需要做youself,例如,通過使用glob模塊。

import glob 
cmd_line = ['grep', '-i', '--line-buffered', 'grave'] + glob.glob('data/*.txt') 
+0

+1的平臺獨立性 –

+0

感謝。爲了更好的平臺獨立性,os.path.join( '數據', '\ *。TXT')應當用來代替 '數據/ \ *。TXT' –