无法将stdout恢复为原始状态(仅限终端)

8 投票
1 回答
9005 浏览
提问于 2025-04-17 09:47

我想把所有的打印信息同时输出到终端和文件里。
我在这个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__

撰写回答