2012-01-08 64 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