如何强制Python的print函数将缓冲输出刷新到屏幕?


另请参阅:如果目标是更改缓冲行为,则禁用输出缓冲。这个问题是关于在特定打印调用后显式刷新输出,即使输出仍在缓冲。

对于重复的闭包:如果初学者问了一个问题,试图在结尾处不使用换行符的情况下立即显示输出,请改用“当结尾处没有换行符时,为什么打印输出不立即显示在终端中?”?结束问题。目前的问题还不够好,因为提问者可能没有缓冲或冲洗的概念;另一个问题旨在首先解释这些概念,而这个问题是关于技术细节的。


当前回答

使用无缓冲区文件:

f = open('xyz.log', 'a', 0)

Or

sys.stdout = open('out.log', 'a', 0)

其他回答

在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-h,我看到一个命令行选项:

-u:无缓冲的二进制stdout和stderr;同样,PYTHONUBUFFERED=x有关“-u”的内部缓冲的详细信息,请参阅手册页

这是相关文档。

使用无缓冲区文件:

f = open('xyz.log', 'a', 0)

Or

sys.stdout = open('out.log', 'a', 0)

我在Python 3.4中这样做:

'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')

丹的想法不太奏效:

#!/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):

使其工作正常。