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


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

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


当前回答

我在Python 3.4中这样做:

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

其他回答

在Python 3中,print可以采用可选的flush参数:

print("Hello, World!", flush=True)

在Python 2中,调用print后,请执行以下操作:

import sys
sys.stdout.flush()

默认情况下,打印到sys.stdout(有关文件对象的详细信息,请参阅文档)。

运行python-h,我看到一个命令行选项:

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

这是相关文档。

我首先很难理解同花顺选项是如何运作的。我想做一个“加载显示”,下面是我找到的解决方案:

for i in range(100000):
    print('{:s}\r'.format(''), end='', flush=True)
    print('Loading index: {:d}/100000'.format(i+1), end='')

第一行刷新先前的打印,第二行打印新的更新消息。我不知道这里是否存在单行语法。

此外,正如这篇博文中所建议的,可以在无缓冲模式下重新打开sys.stdout:

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

每个stdout.write和打印操作之后都会自动刷新。

这是我的版本,它也提供了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()