【问题标题】:Usage of sys.stdout.flush() methodsys.stdout.flush() 方法的使用
【发布时间】:2012-04-18 15:40:33
【问题描述】:

sys.stdout.flush() 是做什么的?

【问题讨论】:

标签: python sys


【解决方案1】:

Python 的标准输出是缓冲的(这意味着它会在将数据写入终端之前收集一些“写入”到标准输出的数据)。调用sys.stdout.flush() 会强制它“刷新”缓冲区,这意味着它会将缓冲区中的所有内容写入终端,即使通常它会在这样做之前等待。

这里有一些关于(非)缓冲 I/O 及其有用的有用信息:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

【讨论】:

  • @Ciastopiekarz 我们可以做些什么来刷新 Windows 上的缓冲区?
  • @Ciastopiekarz 你觉得怎么样?如果我使用 Andrew Clark 的 Python 脚本,并将打印行替换为 sys.stdout.write("%d" % i),那么我必须取消对 sys.stdout.flush() 的调用的注释,以便在脚本执行时显示缓冲区。
【解决方案2】:

考虑以下简单的 Python 脚本:

import time
import sys

for i in range(5):
    print(i),
    #sys.stdout.flush()
    time.sleep(1)

这旨在每秒打印一个数字,持续五秒钟,但如果您现在运行它(取决于您的默认系统缓冲),您可能在脚本完成之前看不到任何输出,然后您一次将看到0 1 2 3 4 打印到屏幕上。

这是因为输出正在被缓冲,除非您在每个 print 之后刷新 sys.stdout,否则您不会立即看到输出。从sys.stdout.flush() 行中删除注释以查看区别。

【讨论】:

  • 在 Python 3.x 中,'print i' 应该替换为 print(i, end=' ') 因为 Python 3 中的 print() 有一个默认前缀 end='\n' 提示控制台刷新。
  • 我很困惑,当我删除逗号时,它按预期工作正常。是否有新行的缓冲逻辑??
【解决方案3】:

根据我的理解,当我们执行打印语句时,输出将被写入缓冲区。当缓冲区被刷新(清除)时,我们将在屏幕上看到输出。默认情况下,缓冲区将在程序退出时被刷新。但我们也可以通过在程序中使用“sys.stdout.flush()”语句手动刷新缓冲区。在下面的代码中,当 i 的值达到 5 时,缓冲区将被刷新。

你可以通过执行下面的代码来理解。

chiru@online:~$ cat flush.py
import time
import sys

for i in range(10):
    print i
    if i == 5:
        print "Flushing buffer"
        sys.stdout.flush()
    time.sleep(1)

for i in range(10):
    print i,
    if i == 5:
        print "Flushing buffer"
        sys.stdout.flush()
chiru@online:~$ python flush.py 
0 1 2 3 4 5 Flushing buffer
6 7 8 9 0 1 2 3 4 5 Flushing buffer
6 7 8 9

【讨论】:

  • print i 之后缺少逗号以获取您的输出
【解决方案4】:
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()

【讨论】:

    【解决方案5】:

    根据我的理解 sys.stdout.flush() 将所有已缓冲到该点的数据推送到文件对象。 使用标准输出时,数据在写入终端之前存储在缓冲内存中(一段时间或直到内存被填满)。使用 flush() 会强制清空缓冲区并在缓冲区没有空间之前写入终端。

    【讨论】:

      【解决方案6】:

      你可以看到这两者的区别

      import sys
      
      for i in range(1,10 ):
          sys.stdout.write(str(i))
          sys.stdout.flush()
      
      for i in range(1,10 ):
          print i
      

      【讨论】:

      • 这里有什么区别?这个答案似乎不完整(尽管我显然知道其中的区别,但最好在 SE 上完整地解释答案而不是让事情悬而未决)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 2017-01-03
      • 2020-10-25
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多