将注释输出的打印语句转换为日志调用-Python

将注释输出的打印语句转换为日志调用-Python,python,regex,debugging,logging,Python,Regex,Debugging,Logging,我现在正在破解一个框架,我想使用日志记录。然而,该框架的开发人员一直在使用print语句进行调试,并且在生产版本中都对它们进行了注释。我想知道,是否有人知道一个正则表达式可以找到这些,并将它们转换为日志调用 这就是我目前的想法: import re import sys import StringIO if not len(sys.argv) != 2: print 'Syntax: printtologging.py file_to_process' regex = r'#prin

我现在正在破解一个框架,我想使用日志记录。然而,该框架的开发人员一直在使用print语句进行调试,并且在生产版本中都对它们进行了注释。我想知道,是否有人知道一个正则表达式可以找到这些,并将它们转换为日志调用

这就是我目前的想法:

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()
重新导入
导入系统
导入StringIO
如果不是len(系统参数)!=2:
打印“语法:printtologging.py文件到进程”
regex=r'#print(?P*)$'
输出=StringIO.StringIO('w+'))
def替换(匹配对象):
返回'logging.debug({0})'.format(match_object.group_dict['debugstring'])
打开(sys.argv[1])作为f:
output.writelines([re.sub(regex,replace,line)用于f.readlines()中的行)
输出搜索(0)
打印输出。读取()

虽然这似乎不起作用。我的正则表达式远远不够出色,有人能帮忙吗?

如果所有打印语句都已包含在括号中,那么sed将完成以下工作:

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

如果所有打印语句都已包含在括号中,则sed将执行以下操作:

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

使用sed可以实现同样的效果

sed -i.old -E -e "s/#+[[:space:]]*print (.*)/logging.debug(\1)/" FILE
我让你的正则表达式更健壮了一点。现在,如果存在多个#和/或#和打印之间的空格,它也会匹配

请注意,它仍然不能处理某些边缘情况,如

#print 'foo'; print'bar'

-i.old
激活就地编辑,并将备份写入
文件.old
。如果您不需要备份,请省略
.old
,即
sed-i-e…

您可以使用sed实现同样的功能

sed -i.old -E -e "s/#+[[:space:]]*print (.*)/logging.debug(\1)/" FILE
我让你的正则表达式更健壮了一点。现在,如果存在多个#和/或#和打印之间的空格,它也会匹配

请注意,它仍然不能处理某些边缘情况,如

#print 'foo'; print'bar'

-i.old
激活就地编辑,并将备份写入
文件.old
。省略<代码>。旧的/代码>如果你不想备份,也就是<代码> SED-IE…

> P>如果你想在Python中使用,请考虑使用模块:

您可以这样调用脚本

% print2log.py *.py
它就地转换脚本,并生成以
~
结尾的备份文件

请注意,正则表达式转换为

#print 'foo'   -->  logging.debug('foo')
但是,如果print语句已经有一组括号,则添加一组额外的括号:

#print('foo')  --> logging.debug(('foo'))
它还破坏了多行打印语句:

#print('''foo        logging.debug(('''foo)
#bar''')       -->   #bar''')
解决这个问题要困难得多,需要解析注释并使用比正则表达式更智能的方法,正则表达式不能正确处理嵌套括号。
我认为你可以做到这一点,而且代码与精神相似,但要花一些时间和思想才能使它正确。

< P>如果你想在Python中使用它,请考虑使用模块:

您可以这样调用脚本

% print2log.py *.py
它就地转换脚本,并生成以
~
结尾的备份文件

请注意,正则表达式转换为

#print 'foo'   -->  logging.debug('foo')
但是,如果print语句已经有一组括号,则添加一组额外的括号:

#print('foo')  --> logging.debug(('foo'))
它还破坏了多行打印语句:

#print('''foo        logging.debug(('''foo)
#bar''')       -->   #bar''')
解决这个问题要困难得多,需要解析注释并使用比正则表达式更智能的方法,正则表达式不能正确处理嵌套括号。
我想你可以用,用精神上类似的代码,但这需要一些时间和思考才能使其正确。

另一种方法是保留print语句,并用类似文件的对象替换sys.stdout以进行日志记录。

另一种方法是保留print语句,并用类似文件的对象替换sys.stdout以进行日志记录。

我认为您只需要在正则表达式中使用
*
而不是
*
。(如果没有这个更改,这段代码不会为我运行。)另外,这是
sed
perl
中的一行代码。例如,
perl-p-i.orig-e的/#print(.*)/logging.debug(\1)/'文件…
。当程序只有一行时,Perl处于最佳状态,您永远不会计划再次阅读它我认为您只需要在正则表达式中使用
*
而不是
*
。(如果没有这个更改,这段代码不会为我运行。)另外,这是
sed
perl
中的一行代码。例如,
perl-p-i.orig-e的/#print(.*)/logging.debug(\1)/'文件…
。当程序只有一行时,Perl处于最佳状态,您永远不会计划再次阅读它啊,我不知道
.old
。非常聪明。谢谢。啊,我不知道
.old
。非常聪明。谢谢。谢谢,这就是我要找的。line=re.sub(r'(\s*)print\s*(*),r'\1logging.debug\2',line)我改成了,因为我已经有了打印函数,而且它还添加了空格。如果没有它,所有的logging.debug()调用都会在源代码中最左边结束。谢谢,这就是我要找的。line=re.sub(r'(\s*)print\s*(*),r'\1logging.debug\2',line)我改成了这个,因为我已经有了打印函数,而且它还添加了空格。如果没有它,所有logging.debug()调用都将以源代码中最左边的调用结束。