Python刷新print语句

时间:2014-02-24 11:13:47

标签: python stdout flush logfile

我重新想要一些python代码,这些代码允许我输出到控制台和具有相同print语句的日志文件。在谷歌搜索之后,我找到了this网站,它提供了一个很好的解决方案。但是,我希望能够在每次写入后刷新输出缓冲区,以便在日志文件中查看它。我该如何将它添加到这个课程中?

我试过按照设置......

class output_file(object):
  def __init__(self, stdout, filename):
    silentremove(filename)
    self.stdout = stdout
    self.logfile = open(filename, "a")

def write(self, text):
    self.stdout.write(text)
    self.logfile.write(text)
    sys.stdout.flush()

  def flush(self):
    sys.stdout.flush()

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

这是一个循环错误,导致flush函数调用自己。

class output_file(object):
  def __init__(self, stdout, filename):
    silentremove(filename)
    self.stdout = stdout
    self.logfile = open(filename, "a")

  def write(self, text):
    self.stdout.write(text)
    self.logfile.write(text)
    self.stdout.flush()

  def flush(self):
    sys.stdout.flush()

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

这根本没有冲洗它。

1 个答案:

答案 0 :(得分:4)

以下以非缓冲模式重新打开sys.stdout。之后,每个stdout.writeprint将自动刷新(即打印到标准输出)。

import sys
import os

# Flush STDOUT continuously
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.fdopen的第三个参数是缓冲参数,0是无缓冲的,1是行缓冲的,>1将导致(大约)该大小的缓冲区(在字节),<0将使用系统默认值。

<强>更新

使用Python 3不允许使用无缓冲文本,即以下

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

会导致错误

ValueError: Can't have unbuffered text I/O

要在python3中使用无缓冲的I / O,可以使用字节,即

sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)

在python3中可以正常工作。