2010-12-10 5 views
1

私は現在フレームワークをハッキングしています。ロギングを使用したいと思います。しかし、フレームワークの開発者は、printステートメントを使用してデバッグしており、それらはすべて本番リリースではコメントアウトされています。私は疑問に思っていた、誰かがこれらを見つけてログを呼び出すように変換する正規表現を知っていますか?コメント文をロギング呼び出しに変換 - 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() 

それが働いているように見えるけれどもdosn't:

は、これは私がこれまで考えていたものです。私の正規表現ははるかに鮮明ではありません。

+5

正規表現で '*'の代わりに '。*'が必要だと思います。 (その変更がなければ、このコードは私のために実行されません) –

+1

また、これは 'sed'または' perl'の1行です。たとえば、 'perl -p -i.orig -e '/#print(。*)/ logging.debug(\ 1)/' FILE ... 'のようになります。あなたのプログラムが1行で、もう一度それを読む予定がない場合、Perlは最高です。 ;) –

答えて

3

fileinputモジュールを使用することを検討して、.oldを省略します:

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') 

を変換しますが、印刷文は既に1を持っていた場合は、括弧の余分なセットを追加すること

注意

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

これを修正することは、コメントを解析しsomを使用することが非常に難しい問題です正規表現よりも賢く、ネストした括弧を適切に処理できません。 あなたはtokenizeでそれをやることができますし、reindent.pyと精神が似ているコードだと思っていますが、ちょっと時間がかかりそうです。

+0

ありがとう、それは私が探していたものです。 –

+0

line = re.sub(r '(\ s *)print \ s *(。*)'、r '\ 1logging.debug \ 2'、行) –

+0

私はすでに印刷機能を持っていたので、それは空白を追加します。それがなければ、すべてのlogging.debug()呼び出しがソースの一番左になります。 –

1

すべてのプリント文がすでに括弧に含まれている場合は、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に書き込まれたバックアップとインプレース編集を活性化させます。あなたがバックアップをしたくない場合は、Pythonでそれをしたい場合、すなわちsed -i -E ...

+0

ああ、 '.old'について知りませんでした。非常に賢い。ありがとう。 –

0

これに代わる方法として、printステートメントをそのまま残し、sys.stdoutを、ロギングを行うオブジェクトのようなファイルに置き換える方法があります。

関連する問題