【问题标题】:Why is it important to flush characters stored in buffer?为什么刷新存储在缓冲区中的字符很重要?
【发布时间】:2018-01-12 05:09:51
【问题描述】:

我希望我的 python 程序不断更新下载状态而不打印换行符,发现我可以使用 \r 如下。

print('Download status: '+str(download), end='\r')

现在我还读到我还应该包括 flush = true

..., end='\r' flush=true)

但我不能确切地看到它的目的。如果我不使用冲洗,我将来会遇到什么问题?我知道已经有一个关于它的线程,但我无法真正理解如何使我的代码受益,因为即使没有刷新它也能正常工作。

【问题讨论】:

  • 顺便说一句,应该是flush=True。并且让print 转换为字符串和连接更有效:print('Download status:', download, end='\r', flush=True)
  • @PM2Ring 谢谢,这是否意味着如果我的终端在没有flush=true的情况下显示下载状态更新,那么就不需要使用它了吗?
  • @PM2Ring 太棒了。请重新发布您的评论作为答案。我会将其标记为已回答,以便像我这样的未来新手可以轻松理解刷新的目的。

标签: python buffer newline flush


【解决方案1】:

通常,终端是行缓冲的,因此如果print 的输出不包含换行符,则在发出换行符 或程序结束并@ 时,您将看不到任何内容987654323@ 作为关闭过程的一部分被刷新。在这种情况下,您需要将 flush=True arg 添加到 print 调用中。您也可以显式调用sys.stdout.flush(),但让print 处理它更方便(而且速度稍快)。在 Python 2 中,您别无选择,只能调用 sys.stdout.flush()

但是,在 Python 3 中,如果输出中有 \r(回车),print 函数会为您执行缓冲区刷新。所以在这种情况下,你不必担心冲洗。

OTOH,请注意,某些 IDE / 终端可能不支持此行为,您需要使用 flush=Truesys.stdout.flush() 与它们一起使用。就此而言,某些 IDE 在使用 \rend='' 打印时甚至可能无法正常运行,即使您明确刷新,例如 Spyder

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2011-08-26
    • 2018-06-14
    • 2022-10-02
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2013-02-09
    • 2012-08-13
    相关资源
    最近更新 更多