无法将stdout恢复为原始状态(仅限终端)
我想把所有的打印信息同时输出到终端和文件里。
我在这个StackOverflow问题中找到了一个解决方案。
所以我用了
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 依然同时输出到终端和文件。
有没有什么好主意?
1 个回答
18
你需要在重新分配之前,先保存原始的文件描述符的引用:
oldstdout = sys.stdout
然后再把它重新赋值给 sys.stdout
!
del
语句并不是直接调用 __del__
方法,而是减少了你对象的引用计数。当引用计数降到零时,你的对象就快要被销毁了,这时 __del__
方法才会被调用。所以你不能强制重新赋值,因为这取决于垃圾回收器来调用你的 __del__
方法。
你需要直接重新赋值 sys.stdout
变量:
试试:
sys.stdout = sys.__stdout__