Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将python输出重定向到文件将打印两行_Python_Logging - Fatal编程技术网

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

将python输出重定向到文件将打印两行,python,logging,Python,Logging,根据另一个堆栈溢出问题的建议,我编写了自己的LogWriter类: class LogWriter: def __init__(self, output, filename): self.output = output self.logfile = file(filename, 'a') def write(self, text): now = datetime.now() stam

根据另一个堆栈溢出问题的建议,我编写了自己的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中获得隐式换行符,作为单独的write调用。无论哪种方式,问题都是您要编写多个调用,因为无法保证调用方如何使用write-如果愿意,它可以为每个字符调用write。

尝试:


您可能从print中获得隐式换行符,作为单独的write调用。无论哪种方式,问题都是您将收到多个要写入的调用,因为无法保证调用方如何使用write-如果愿意,它可以为每个字符调用write。

您不应该假设一个print语句导致一个要写入的调用。因此,我认为在每次写入时生成时间戳的整个方法是有缺陷的


您可以尝试通过在文本中查找字符,在每行的开头生成一个时间戳来解决此问题,但这也不会让我觉得特别优雅。

您不应该假设一条print语句导致一次写入调用。因此,我认为在每次写入时生成时间戳的整个方法是有缺陷的


您可以通过在文本中查找字符,在每一行的开头生成一个时间戳来解决这个问题,但这也不会让我觉得特别优雅。

对于我需要做的事情,我真的建议这样做太过分了,我只会进行4-5次日志调用,但我认为这是一种python式的日志记录方式,原来我错了!对于我需要做的事情,我真的建议这样做太过分了,我将只进行4-5次日志调用,但我认为这是一种python式的日志记录方式,结果证明我错了!你说得对。我以前曾假设多行打印仍然会导致一次调用写入。似乎换行符发生在换行符上,因此我分别得到了“test”和“\n”。我要放弃这种方法,你说得对。我以前曾假设多行打印仍然会导致一次调用写入。似乎换行符发生在换行符上,因此我分别得到了“test”和“\n”。我将放弃这种方法。没有这样的运气,仍然会产生与上面相同的打印语句。没有这样的运气,仍然会产生与上面相同的打印语句。
>>>print "test",