如何强制Python的print函数将缓冲输出刷新到屏幕?
另请参阅:如果目标是更改缓冲行为,则禁用输出缓冲。这个问题是关于在特定打印调用后显式刷新输出,即使输出仍在缓冲。
对于重复的闭包:如果初学者问了一个问题,试图在结尾处不使用换行符的情况下立即显示输出,请改用“当结尾处没有换行符时,为什么打印输出不立即显示在终端中?”?结束问题。目前的问题还不够好,因为提问者可能没有缓冲或冲洗的概念;另一个问题旨在首先解释这些概念,而这个问题是关于技术细节的。
如何强制Python的print函数将缓冲输出刷新到屏幕?
另请参阅:如果目标是更改缓冲行为,则禁用输出缓冲。这个问题是关于在特定打印调用后显式刷新输出,即使输出仍在缓冲。
对于重复的闭包:如果初学者问了一个问题,试图在结尾处不使用换行符的情况下立即显示输出,请改用“当结尾处没有换行符时,为什么打印输出不立即显示在终端中?”?结束问题。目前的问题还不够好,因为提问者可能没有缓冲或冲洗的概念;另一个问题旨在首先解释这些概念,而这个问题是关于技术细节的。
当前回答
在Python 3中,您可以使用默认设置为flush=True来覆盖打印函数
def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
__builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)
其他回答
这是我的版本,它也提供了writeline()和fileno():
class FlushFile(object):
def __init__(self, fd):
self.fd = fd
def write(self, x):
ret = self.fd.write(x)
self.fd.flush()
return ret
def writelines(self, lines):
ret = self.writelines(lines)
self.fd.flush()
return ret
def flush(self):
return self.fd.flush
def close(self):
return self.fd.close()
def fileno(self):
return self.fd.fileno()
丹的想法不太奏效:
#!/usr/bin/env python
class flushfile(file):
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
import sys
sys.stdout = flushfile(sys.stdout)
print "foo"
结果:
Traceback (most recent call last):
File "./passpersist.py", line 12, in <module>
print "foo"
ValueError: I/O operation on closed file
我认为问题是它继承自file类,这实际上是不必要的。根据sys.stdout的文档:
stdout和stderr不必内置文件对象:可以接受任何对象只要它有write()方法这需要一个字符串参数。
所以改变
class flushfile(file):
to
class flushfile(object):
使其工作正常。
在Python 3中,您可以使用默认设置为flush=True来覆盖打印函数
def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
__builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)
在Python 3中,print可以采用可选的flush参数:
print("Hello, World!", flush=True)
在Python 2中,调用print后,请执行以下操作:
import sys
sys.stdout.flush()
默认情况下,打印到sys.stdout(有关文件对象的详细信息,请参阅文档)。
我首先很难理解同花顺选项是如何运作的。我想做一个“加载显示”,下面是我找到的解决方案:
for i in range(100000):
print('{:s}\r'.format(''), end='', flush=True)
print('Loading index: {:d}/100000'.format(i+1), end='')
第一行刷新先前的打印,第二行打印新的更新消息。我不知道这里是否存在单行语法。