sys.stdout.flush()做什么?


当前回答

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

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

其他回答

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

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

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

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

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

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

考虑以下简单的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 x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()