如何清空print函数的输出?

1586

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


另请参阅:如果目标是通常更改缓冲行为,请使用禁用输出缓冲。本问题是关于在特定print调用后显式刷新输出,尽管仍在缓冲输出。

对于重复关闭者:如果初学者正在询问有关尝试使输出立即出现而不使用结尾换行符的问题,请使用为什么没有结尾换行符时,终端上的打印输出不会立即显示?来关闭问题。当前问题不够好,因为提问者很可能没有概念缓冲或刷新;另一个问题旨在首先解释这些概念,而这个问题涉及技术细节。


13
对我而言,“python -u <script.py>” 可以正常工作(强制刷新,无缓存),无需修改脚本即可实现。 - Charlie Parker
1
请注意,该行为在IDE中出现了著名的错误。例如,PyCharm在调试控制台中可以正常工作,但在运行控制台中无法正常工作。您可能需要隔离问题存在于普通终端中。 - Charles Merriam
13个回答

12

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

1
卓越的解决方案。而且它有效。在Python 3.4.0上进行了测试。对于其他派生自“file”的版本,我会遇到错误。因为没有“file”类。 - Colin D Bennett

8
我用Python 3.4做了这样的事情:
'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')

需要进行解释。例如,它与Eugene Sajine的回答有何不同?(链接为 https://dev59.com/PXVC5IYBdhLWcg3woStW#23142556) - Peter Mortensen

5

我最初很难理解flush选项是如何工作的。我想要做一个“加载显示”,这里是我找到的解决方案:

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

第一行清除了之前的打印,第二行打印了一个新的更新信息。我不知道是否存在一行语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接