2011-12-12 71 views
1

使用的另一個堆棧溢出問題,我寫我自己寫進程類的建議:重定向蟒蛇輸出到文件打印兩行

class LogWriter: 
    def __init__(self, output, filename): 
      self.output = output 
      self.logfile = file(filename, 'a') 

    def write(self, text): 
      now = datetime.now() 
      stamp = now.strftime("%Y-%m-%d - %I:%M:%S") 
      text = "[%s] %s" % (stamp,text) 
      if(DEBUG): 
        self.output.write(text) 
        self.output.flush() 
      self.logfile.write(text) 
      self.logfile.flush() 

    def close(self): 
      self.output.close() 
      self.logfile.close() 

然而,這是輸出我收到:

>>logwriter = LogWriter(sys.stdout, LOG_FILENAME) 
    >>sys.stdout = logwriter 
    >>print "test" 
    [2011-12-12 - 08:15:00] test[2011-12-12 - 08:15:00] 

如果我刪除修改文本並只打印原始郵件的行,該類按預期工作,打印到日誌文件和stdout:

test 

出於某種原因,我的時間戳是重複的,我找不到原因。在python中修復這個錯誤的正確方法是什麼?

編輯:正如下面aix所說,我假定打印電話和寫電話是一對一的,但事實並非如此。舉一個簡單的修復繼續使用我的日誌寫I類現在正在做的電話如下:

... 
def write(self, text): 
      now = datetime.now() 
      stamp = now.strftime("%Y-%m-%d - %I:%M:%S") 
      text = "[%s] %s\n" % (stamp,text) 
... 
>>logwriter = LogWriter(sys.stdout, LOG_FILENAME) 
>>logwriter.write("test") 
[2011-12-12 - 08:38:55] test 
+2

我真的會推薦http://docs.python.org/library/logging.html – Jdog

+0

這對於我需要做的事情來說是過分的,我只會做4-5個日誌調用,但我認爲這是一個pythonic方式做伐木,原來我錯了! –

回答

2

您不應該假設單個print聲明導致對write()的單個調用。因此,我認爲在每個write()上生成時間戳的整個方法都是有缺陷的。

您可以嘗試通過產生在每個開始時間戳(通過尋找text\n字符)解決這個問題,但是,這並不罷工我是特別優雅無論是。

+0

你說得對。我以前認爲多行打印仍然會導致一次寫入調用。看來這個突破發生在一個換行符上,所以我分別獲得了'測試'和'\ n'。我將放棄這種方法。 –

4

嘗試:

>>>print "test", 

也許你從print得到隱含換行符作爲write()單獨調用。無論哪種方式,問題是你有多次致電write()(因爲不能保證呼叫者如何使用write() - 如果喜歡,它可以爲每個角色調用它)。

+0

沒有這樣的運氣,仍然會產生與上面相同的打印聲明。 –