使用sys.stdout.flush()方法

时间:2012-04-04 21:22:57

标签: python sys

sys.stdout.flush()做了什么?

6 个答案:

答案 0 :(得分:142)

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

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

答案 1 :(得分:98)

考虑以下简单的Python脚本:

import time
import sys

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

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

这是因为输出正在缓冲,除非您在每个sys.stdout之后刷新print,否则您将无法立即看到输出。从sys.stdout.flush()行中删除评论以查看差异。

答案 2 :(得分:5)

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

***** OUTPUT *****

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

chiru @ online:〜$

答案 3 :(得分:1)

import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()

答案 4 :(得分:1)

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

答案 5 :(得分:1)

您可以看到两者之间的差异

import sys

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

for i in range(1,10 ):
    print i