Python:为什么这个打印自动刷新到没有flush()的屏幕?

时间:2014-11-24 02:41:17

标签: python flush buffering

我正在阅读python中的std.flush()。我发现了很多这个例子。

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

人们常说,有/没有" sys.stdout.flush()"它会有所不同。 但是,当我从命令提示符调用此脚本时,它对我的​​情况没有任何影响。两个打印的数字都实时显示在屏幕上。 我在windows中使用了python 2.7.5。

为什么会这样?

P.S。在另一个通过subprocess.PIPE而不是直接打印输出的例子中,我确实观察到了缓冲的不同。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

使用flush通常保证刷新已完成,但假设反向关系是逻辑谬误,类似于:

  1. 狗是动物。
  2. 这是一种动物。
  3. 因此这是一只狗。
  4. 换句话说,使用flush并不能保证不会发生冲洗。

    有趣的是,在Win81中使用Cygwin下的Python 2.7.8,我看到了相反的行为 - 一切都被批量化直到最后。它可能与Windows原生Python不同,它也可能与IDLE中的不同。

答案 1 :(得分:1)

stdio buffering。简而言之:

  

默认缓冲模式:

     
      
  • stdin总是被缓冲
  •   
  • stderr始终无缓冲
  •   
  • 如果stdout是终端,则缓冲自动设置为行缓冲,否则设置为缓冲
  •   

对我来说,你给出的例子是:

cmd

  • Cygwin's python退出时的所有数字
  • 在Win32 python中一个接一个

mintty

  • 两者都退出
  • 一个接一个地使用-u选项
  • sys.stdout.isatty()返回False

因此,当msvcrt stdout指向终端时,它看起来是无缓冲的。使用简单C程序进行的测试显示了相同的行为。