我需要将所有打印语句输出到终端和文件。 我在this stackoverflow question找到了解决方案 所以我用
class Tee(object):
def __init__(self, name):
self.file = open(name, "a")
self.stdout = sys.stdout
sys.stdout = self
def __del__(self):
sys.stdout = self.stdout
self.file.close()
def write(self, data):
self.file.write(data)
self.stdout.write(data)
sys.stdout = Tee("log.txt")
这很有效,
我的问题是当我想停止写入文件并返回到只打印到终端的正常操作时
我试图使用del(sys.stdout)来调用 del 方法而没有运气。
我甚至试图将最后一行更改为:
multiple_print = Tee("log.txt")
sys.stdout = multiple_print
而不是使用del(multiple_print)和失败
无论我尝试了什么,进一步使用 print 仍然写入终端并同时归档。
有什么想法吗?
答案 0 :(得分:14)
您需要在重新分配之前保存对原始文件描述符的引用:
oldstdout = sys.stdout
然后将其重新分配给sys.stdout
!
del
语句不直接调用__del__
,而是减少对象的引用计数器。如果引用计数器达到零并且您的对象即将被销毁,则调用__del__
方法。所以你不能强制重新分配,因为它取决于垃圾收集器,调用你的__del__
方法。
您需要直接重新分配sys.stdout变量:
尝试:
sys.stdout = sys.__stdout__