【问题标题】:Stdout and flush? It's appending and not flushing标准输出和冲洗?它是附加的而不是冲洗的
【发布时间】:2015-07-01 21:41:21
【问题描述】:

我正在尝试在我创建的脚本底部添加一些“进度文本”。如果我 for 循环一个列表 [1,2,3,4,5] 并打印 i,那么它只会在不同的行上打印 1,2,3,4 和 5。如果我想将 1 打印到屏幕上,休眠 5 秒,清除它然后打印 2,怎么样?

我尝试过使用 stdout.write("text")、sleep、flush、stdout.write("aetlkjetjer")、sleep,它只是简单地添加到那个“text”语句而不是刷新输出。

我是否误解了 stdout.flush 的工作方式?它不应该刷新/擦除先前打印的输出吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    .flush() 所做的只是清除缓冲区。你真正想要的是将退格(\b)写入stdout

    import time, sys
    
    for i in [1,2,3,4,5]:
        sys.stdout.write(str(i))
        sys.stdout.flush() #flush the buffer because python buffers stdout
        time.sleep(5)
        sys.stdout.write("\b") #literally "write backspace".
        sys.stdout.flush()
    

    如果您想计算多于一位的数字,情况会变得更加复杂。

    【讨论】:

    • 这对我来说很有意义。非常感谢!
    【解决方案2】:

    在计算机科学中,“刷新”一词并不意味着擦除缓冲区中已有的内容。相反,这意味着获取内存中缓冲区(如 stdout 缓冲区)的 未写入 内容并将其写入,在本例中为屏幕。因此,当您告诉程序“刷新标准输出”时,实际上只是在告诉它“获取标准输出中的内容并确保它们全部显示在屏幕上。”

    【讨论】:

    • 非常感谢您的帮助!这准确地澄清了我所经历的困惑
    猜你喜欢
    • 2011-04-22
    • 2018-06-24
    • 1970-01-01
    • 2018-05-23
    • 2011-11-10
    • 1970-01-01
    • 2012-06-19
    • 2016-05-16
    • 2017-12-04
    相关资源
    最近更新 更多