在一个相对较大的python3代码库中,有几个打印声明点缀在我想要找到的代码中。如果可以覆盖打印功能,那么它将变得非常容易,因此它总是打印文件名和行号。示例输出:
>>> print("Some Message")
filename:line_number
Some Message
在我的情况下,这特别是一个问题,因为python文件被包装在二进制blob中,并且对它们进行grepping是徒劳的,但是traceback模块给出的文件名仍然是合理的。
对于python2解决方案,有这样的问题/答案: How to make print() override work "globally"
答案 0 :(得分:1)
在咨询了很多其他没有完全回答我问题的stackoverflow问题之后,出现了以下代码:
import traceback
def dprint(*args):
'''Pre-pends the filename and linenumber to the print
statement'''
stack = traceback.extract_stack()[:-1]
last = stack[-1]
# Handle different versions of the traceback module
if hasattr(last, 'filename'):
out_str = "{}:{}\n".format(last.filename, last.lineno)
else:
out_str = "{}:{}\n".format(last[0], last[1])
# Prepend the filename and linenumber
__builtins__['oldprint'](out_str, *args)
if 'oldprint' not in __builtins__:
__builtins__['oldprint'] = __builtins__['print']
__builtins__['print'] = dprint
它应该处理打印的所有用途,因为它只是预先插入一个参数。