使用sys.stdout.flush()方法

I15*_*159 156 python sys

怎么sys.stdout.flush()办?

Hal*_*own 156

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

这里有一些关于(un)缓冲I/O的好信息以及它有用的原因:
http://en.wikipedia.org/wiki/Data_buffer
缓冲与无缓冲IO


And*_*ark 108

请考虑以下简单的Python脚本:

import time
import sys

for i in range(5):
    print(i),
    #sys.stdout.flush()
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

这是为了打印一个数每秒五秒钟,但如果你运行它,因为它是现在(取决于默认的系统缓存),你可能看不到任何输出,直到脚本完成,然后一下子你会看到0 1 2 3 4印到屏幕.

这是因为输出正在被缓冲,除非你sys.stdout在每次之后刷新,否则你print不会立即看到输出.从sys.stdout.flush()行中删除注释以查看差异.

  • 在Python 3.x中,'print i'应该替换为print(i,end =''),因为Python 3中的print()有一个默认前缀end ='\n',它提示控制台刷新. (39认同)
  • 我很困惑,当我删除逗号它正如预期的那样正常工作.新线路是否有缓冲逻辑? (3认同)

chi*_*iru 6

根据我的理解,当我们执行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()
Run Code Online (Sandbox Code Playgroud)

藏羚羊@在线:〜$

*****输出*****

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
Run Code Online (Sandbox Code Playgroud)

藏羚羊@在线:〜$