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

Gil*_*l.I 8 python

我需要将所有打印语句输出到终端和文件.我在这个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")
Run Code Online (Sandbox Code Playgroud)

这很棒,

我的问题是当我想停止写入文件并返回正常操作时,只打印到终端
我试图使用del(sys.stdout)来调用del方法而没有运气.
我甚至试图将最后一行更改为:

    multiple_print = Tee("log.txt")
    sys.stdout = multiple_print
Run Code Online (Sandbox Code Playgroud)

而且使用del(multiple_print)并失败

无论我尝试了什么,进一步使用打印仍然写入终端和文件两者.

有任何想法吗?

Don*_*ion 15

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

oldstdout = sys.stdout
Run Code Online (Sandbox Code Playgroud)

然后重新分配给它sys.stdout!

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

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

尝试:

sys.stdout = sys.__stdout__
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您也可以使用[sys .__ stdout__](http://docs.python.org/library/sys.html#sys.__stdout__)而不是自己存储旧引用. (14认同)