sys.stdout.flush()方法的用法



sys.stdout.flush()做什么?

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

以下是一些关于(未)缓冲I/O的好信息,以及它有用的原因:
http://en.wikipedia.org/wiki/Data_buffer
缓冲与非缓冲IO

考虑以下简单的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()行中的注释以查看差异。

根据我的理解,当我们执行打印语句时,输出将写入缓冲区。当缓冲区被刷新(清除)时,我们将在屏幕上看到输出。默认情况下,程序退出时将刷新缓冲区。但我们也可以通过在程序中使用"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
import sys
for x in range(10000):
    print "HAPPY >> %s <<r" % str(x),
    sys.stdout.flush()

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

您可以看到这两个的差异

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

在第一种情况下,由于刷新,每个字符在写入后都会一个接一个地输出。在第二种情况下,字符由Python缓冲,直到它认为有值得写的东西,然后一批写完。

如果在循环中添加一个time.sleep(0.2),这将变得更加明显。

想象一下你有一个玩具箱,里面放着你所有的玩具。当你想玩玩具时,你通常会把它从盒子里拿出来,对吧?

以类似的方式,当你在电脑上写东西时,它会被存储在一个叫做缓冲区的临时地方。把它想象成一个装电脑数据的玩具盒子。电脑会等到玩具盒装满后,再从盒子里取出数据并在屏幕上显示给你。

然而,有时你可能想马上玩一个玩具,而不用等到玩具盒里装满其他玩具。这就像在Python中调用sys.stdout.flush()一样。它告诉计算机将数据从缓冲区中取出,并立即在屏幕上显示给您,而无需等待缓冲区填满。

最新更新