2012-01-08 65 views
8

我需要将所有打印语句输出到终端和文件。 我发现在this stackoverflow question 一个解决方案所以我用无法将stdout恢复到原始状态(仅限于终端)

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 

,比使用德尔(multiple_print)和失败的

不管我试过,打印的进一步用途仍被写入终端和文件都。

任何想法?

回答

12

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

oldstdout = sys.stdout 

,并随后重新分配给sys.stdout

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

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

尝试:

sys.stdout = sys.__stdout__ 
+0

感谢。我试图让复杂的解决方案工作,忘记了基本。但是,你知道__del__为什么不起作用吗? (它包含保存在__init__部分中的sys.stdout = self.stdout) – 2012-01-08 11:52:56

+11

请注意,您也可以使用[sys .__ stdout__](http://docs.python.org/library/sys.html#sys.__stdout__)而不是自己存储旧的参考。 – 2012-01-08 11:53:17

+0

我更新了我的答案以解决您的后续问题!而弗雷德里克哈米迪有一个点!我不知道'sys .__ stdout__'! – 2012-01-08 11:56:08