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

时间:2012-01-08 11:34:20

标签: python

我需要将所有打印语句输出到终端和文件。 我在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 仍然写入终端并同时归档。

有什么想法吗?

1 个答案:

答案 0 :(得分:14)

您需要在重新分配之前保存对原始文件描述符的引用:

oldstdout = sys.stdout

然后将其重新分配给sys.stdout

del语句不直接调用__del__,而是减少对象的引用计数器。如果引用计数器达到零并且您的对象即将被销毁,则调用__del__方法。所以你不能强制重新分配,因为它取决于垃圾收集器,调用你的__del__方法。

您需要直接重新分配sys.stdout变量:

尝试:

sys.stdout = sys.__stdout__