Skip to main content
 首页 » 编程设计

python之将 python 输出重定向到文件打印两行

2025年05月04日19linjiqin

根据另一个堆栈溢出问题的建议,我编写了自己的 LogWriter 类:

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] 

如果我删除修改文本的行并只打印原始消息,该类将按预期工作,同时打印到日志文件和标准输出:

test 

由于某种原因,我的时间戳重复了,我不明白为什么。在 Python 中修复此错误的正确方法是什么?

编辑: 正如 aix 在下面所说的,我假设打印调用和写入调用是一对一的,但事实并非如此。作为继续使用我的 LogWriter 类的简单修复,我现在按如下方式进行调用:

... 
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 

请您参考如下方法:

尝试:

>>>print "test", 

可能您从 print 获取隐式换行符作为对 write() 的单独调用。无论哪种方式,问题是您正在多次调用 write() (因为无法保证调用者如何使用 write() - 它可能会调用它每个角色,如果喜欢的话)。