sys.stdout.flush() 方法的用法
- 2025-02-28 08:23:00
- admin 原创
- 80
问题描述:
做什么sys.stdout.flush()
?
解决方案 1:
Python 的标准输出是缓冲的(这意味着它会在将数据写入终端之前收集“写入”标准输出的一些数据)。调用sys.stdout.flush()
会强制它“刷新”缓冲区,这意味着它会将缓冲区中的所有内容写入终端,即使通常它会等待再这样做。
这里有一些关于(无)缓冲 I/O 以及它为什么有用的有用信息:
http://en.wikipedia.org/wiki/Data_buffer
缓冲与无缓冲 IO
解决方案 2:
考虑以下简单的 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()
即可看到差异。
解决方案 3:
根据我的理解,每当我们执行打印语句时,输出都会写入缓冲区。当缓冲区被刷新(清除)时,我们将在屏幕上看到输出。默认情况下,程序退出时将刷新缓冲区。但我们也可以通过在程序中使用“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
解决方案 4:
根据我的理解,sys.stdout.flush() 会将缓冲到该点的所有数据推送到文件对象。使用 stdout 时,数据会存储在缓冲内存中(一段时间或直到内存填满),然后再写入终端。使用 flush() 会强制清空缓冲区,并在缓冲区有空余空间之前写入终端。
解决方案 5:
import sys
for x in range(10000):
print "HAPPY >> %s <<
" % str(x),
sys.stdout.flush()
解决方案 6:
你可以看到这两者之间的差异
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)
如果你在循环中添加一个,这一点就会变得更加明显。
解决方案 7:
想象一下,你有一个玩具箱,里面放着你所有的玩具。当你想玩玩具时,你通常会把它从盒子里拿出来,对吗?
类似地,当你在计算机上写东西时,它会被存储在一个称为缓冲区的临时位置。你可以把它想象成一个计算机数据的玩具箱。计算机会等到玩具箱装满后才将数据从盒子中取出并在屏幕上显示给你。
但是,有时您可能想立即玩玩具,而不必等待玩具箱装满其他玩具。这就像在 Python 中调用 sys.stdout.flush() 一样。它告诉计算机立即从缓冲区中取出数据并将其显示在屏幕上,而无需等待缓冲区填满。
扫码咨询,免费领取项目管理大礼包!