2016-11-07 94 views
0

我有一些像這樣的代碼:運行grep的 - 不工作

f = open("words.txt", "w") 
subprocess.call(["grep", p, "/usr/share/dict/words"], stdout=f) 
f.close() 

我希望到grep MacOS的字典一定的模式,並將結果寫入words.txt。例如,如果我想要執行類似grep '\<a.\>' /usr/share/dict/words的操作,則可以使用p = "'\<a.\>'"運行上述代碼。但是,子流程調用似乎無法正常工作,並且words.txt仍爲空。任何想法,爲什麼這是?另外,有沒有辦法將正則表達式應用於/usr/share/dict/words而不調用grep子進程?

編輯: 當我在終端運行grep '\<a.\>' /usr/share/dict/words,我得到的話,如:AA 廣告 AE 啊 人工智能 AK 人 上午 的 AR 作爲 在 AW 斧頭 AY爲導致終端(或者如果我在那裏重定向他們的文件)。這是我在運行子進程調用後期望words.txt的結果。

+1

請至少提供一個您期望的匹配。 到目前爲止,我認爲你可以安全地從你的模式中移除字符和''''''''。你不必轉義字符,因爲你現在沒有使用shell。 您當前的調用應該使用附加參數'shell = True' – woockashek

+0

@woockashek添加的示例匹配 –

回答

2

像@woockashek已經評論過,你沒有得到任何結果,因爲你的輸入文件中沒有'\<a.\>'命中。你可能真的希望找到\<a.\>,但顯然你需要省略單引號,這會讓你感到困惑。

當然,Python完全知道如何在文件中查找正則表達式。

import re 

rx = re.compile(r'\ba.\b') 
with open('/usr/share/dict/words', 'Ur') as reader, open('words.txt', 'w') as writer: 
    for line in reader: 
     if rx.search(line): 
      print(line, file=writer, end='') 

單引號這裏是Python的字符串語法的一部分,就像在命令行中的單引號shell語法的一部分。在任何情況下,它們都不是你正在搜索的實際正則表達式的一部分。

subprocess.Popen文檔隱約暗示經常被忽視的事實,即當您沒有shell=True(通常您應該避免,因爲這個以及其他原因)shell的報價不是必需的或有用的。

不幸的是,Python不支持\<\>作爲字邊界操作符,所以我們不得不使用(功能上相同的)\b來代替。

+0

謝謝!很好的解釋和Python例子 –

-1

由call()啓動的進程的標準輸入和輸出通道綁定到父代的輸入和輸出。這意味着調用程序無法捕獲命令的輸出。使用check_output()來捕獲輸出爲以後處理:

import subprocess 
f = open("words.txt", "w") 
output = subprocess.check_output(['grep', p ,'-1']) 
file.write(output) 
print output 
f.close() 

PD:我希望它的作品,我不能檢查的答案,因爲我還沒有MacOS的嘗試。

+0

您可以將標準輸出綁定到打開的文件句柄上;這不是問題。 – tripleee