2010-12-10 23 views
1

我現在正在攻擊一個框架,並且我想使用日誌記錄。但是,框架的開發人員一直在使用打印語句進行調試,並且他們都被註釋爲生產版本。我想知道,有沒有人知道一個正則表達式來找到這些,並將它們轉換爲日誌記錄調用。將註釋掉的打印語句轉換爲日誌記錄調用 - Python

這是我至今想:

import re 
import sys 
import StringIO 

if not len(sys.argv) != 2: 
    print 'Syntax: printtologging.py file_to_process' 

regex = r'#print (?P<debugstring>*)$' 

output = StringIO.StringIO('w+') 

def replace(match_object): 
    return 'logging.debug({0})'.format(match_object.group_dict['debugstring']) 

with open(sys.argv[1]) as f: 
    output.writelines([re.sub(regex, replace, line) for line in f.readlines()]) 

output.seek(0) 
print output.read() 

雖然這不到風度似乎工作。我的正則表達式很不棒,有人能幫忙嗎?

+5

我認爲你只需要'。*'而不是'*'在正則表達式中。 (如果沒有這樣的改變,這段代碼就不會爲我運行。) – 2010-12-10 15:43:44

+1

另外,這是'sed'或'perl'中的一行代碼。例如,'perl -p -i.orig -e's /#print(。*)/ logging.debug(\ 1)/'FILE ...'。當你的程序只有一行時,Perl是最好的,你永遠不會再讀它。 ;) – 2010-12-10 15:48:12

回答

3

如果你想這樣做在Python中,可以考慮使用fileinput模塊:

import fileinput 
import sys 
import re 

def convert(paths): 
    for line in fileinput.input(paths, inplace=True, backup='~'): 
     line=re.sub(r'#\s*print\s*(.*)',r'logging.debug(\1)',line) 
     sys.stdout.write(line) 

if __name__=='__main__': 
    convert(sys.argv[1:]) 

你可以調用腳本這樣

% print2log.py *.py 

它就地轉換腳本,並創建一個以~結尾的備份文件。

注意,正則表達式轉換

#print 'foo' --> logging.debug('foo') 

,但增加了一個額外的括號如果print語句已經有一個:

#print('foo') --> logging.debug(('foo')) 

它也砸了多行打印語句:

#print('''foo  logging.debug(('''foo) 
#bar''')  --> #bar''') 

解決這個問題非常困難,需要解析註釋並使用som比正則表達式更聰明,它無法正確處理嵌套的括號。 我認爲你可以用tokenize來完成,代碼精神與reindent.py相似,但這需要一些時間並且認爲它是正確的。

+0

謝謝,這就是我一直在尋找的。 – 2010-12-10 16:58:42

+0

line = re.sub(r'(\ s *)print \ s *(。*)',r'\ 1logging.debug \ 2',line) – 2012-12-10 12:43:39

+0

我改變了,因爲我已經有了打印功能AND也它增加了空格。沒有它,所有的logging.debug()調用將最終在源代碼中最左邊。 – 2012-12-10 12:44:35

1

如果所有的print語句已經包含在括號,然後SED將做的工作:

sed -i s/#print/logging\.debug/g files_to_process 
1

可以達到同樣的使用sed

sed -i.old -E -e "s/#+[[:space:]]*print (.*)/logging.debug(\1)/" FILE 

我做你的正則表達式多一點強大的。如果#和print之間存在多個#和/或空格,它現在也匹配。

注意,它仍然沒有處理一些邊緣情況下,像

#print 'foo'; print'bar' 

-i.old激活就地編輯與寫入FILE.old備份。省略.old如果你不想備份,即sed -i -E ...

+0

啊,不知道'.old'。非常聰明。謝謝。 – 2010-12-10 16:58:18

0

另一種方法是將打印語句保留原位並將sys.stdout替換爲執行日誌記錄的對象之類的文件。