全局覆盖print语句python

时间:2017-06-15 08:34:58

标签: python python-3.x printing override

在一个相对较大的python3代码库中,有几个打印声明点缀在我想要找到的代码中。如果可以覆盖打印功能,那么它将变得非常容易,因此它总是打印文件名和行号。示例输出:

>>> print("Some Message")
filename:line_number
Some Message

在我的情况下,这特别是一个问题,因为python文件被包装在二进制blob中,并且对它们进行grepping是徒劳的,但是traceback模块给出的文件名仍然是合理的。

对于python2解决方案,有这样的问题/答案: How to make print() override work "globally"

1 个答案:

答案 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

它应该处理打印的所有用途,因为它只是预先插入一个参数。