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

其他回答

根据我的理解,当我们执行打印语句时,输出将被写入缓冲区。当缓冲区被刷新(清除)时,我们将在屏幕上看到输出。默认情况下,当程序退出时缓冲区将被刷新。但是我们也可以在程序中使用"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()

考虑以下简单的Python脚本:

import time
import sys

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

它被设计为每秒钟打印一个数字,持续5秒,但是如果你像现在这样运行它(取决于你的默认系统缓冲),你可能在脚本完成之前看不到任何输出,然后你会看到0 1 2 3 4打印到屏幕上。

这是因为输出正在被缓冲,除非您刷新sys。每次打印后,您不会立即看到输出。从sys.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()将强制它“刷新”缓冲区,这意味着它将把缓冲区中的所有内容写入终端,即使通常它在这样做之前会等待。

这里有一些关于(unbuffered) I/O的好信息,以及它为什么有用: http://en.wikipedia.org/wiki/Data_buffer 缓冲IO与非缓冲IO