背景:我注意到诀窍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?
答案 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)