重新定义打印以打开,写入日志文件,关闭

时间:2017-09-30 16:06:16

标签: python python-2.7 logging nohup

背景:我注意到诀窍nohup python test.py &通常无法正常工作,因为nohup.out中的输出无法实时正确保存。给定in this famous question(例如nohup python -u)的解决方案并不总是有效,如in my other question here所示。

问题:我在代码中的任何地方都使用了print(...),因此我不想更改此内容并将其替换为其他日志记录功能。是否可以重新定义print来执行此操作:

from __future__ import print_function

def print(s):
    with open('out.txt', 'a+') as f:
        f.write(str(s) + '\n')
    old_print(s)     # how to print it with the standard print too?

1 个答案:

答案 0 :(得分:0)

好吧,你可以覆盖内置函数。

考虑一下test.py:

from __future__ import print_function

def new_print(*args, **kwargs):
    old_print('HELLO!')

import __builtin__
old_print = __builtin__.print
__builtin__.print = new_print

print(100)  # -> HELLO!
old_print(200)  # -> 200

如果你只在sigle模块中重新定义内置函数一次,然后只导入它就会有效 - 这会影响整个应用程序。

from __future__ import print_function
import test

print(300)  # HELLO!

但是你仍然需要从py2中继续导入。否则,打印将不是内置函数,而是操作符,因此永远不会被覆盖。

这个技巧也可以在py3中使用,但模块名称为builtins除外。所以代码可能是这样的:

from __future__ import print_function

def new_print(*args, **kwargs):
    old_print('HELLO!')

try:
    import __builtin__ as bi  # py2
except ImportError:
    import builtins as bi # py3

old_print = bi.print
bi.print = new_print

print(100)
old_print(200)