213

做什么sys.stdout.flush()

4

6 回答 6

213

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

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

于 2012-04-04T21:35:18.087 回答
144

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

于 2012-04-04T21:34:48.513 回答
10

据我了解,当我们执行打印语句时,输出将被写入缓冲区。当缓冲区被刷新(清除)时,我们将在屏幕上看到输出。默认情况下,缓冲区将在程序退出时被刷新。但我们也可以通过在程序中使用“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
于 2015-10-27T09:41:22.297 回答
2
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()
于 2016-08-28T07:12:10.537 回答
2

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

于 2018-07-16T12:41:04.347 回答
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

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

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

于 2020-08-10T03:52:47.173 回答