我重新想要一些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()
这根本没有冲洗它。
答案 0 :(得分:4)
以下以非缓冲模式重新打开sys.stdout。之后,每个stdout.write
和print
将自动刷新(即打印到标准输出)。
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中可以正常工作。