2014-11-24 353 views
1

我正在閱讀關於python中的std.flush()。我發現這個例子很多。Python:爲什麼這個打印自動刷新到屏幕沒有flush()?

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

人們經常說,它與/沒有「sys.stdout.flush()」有區別。 但是,當我從命令提示符調用此腳本時,它在我的情況中沒有任何區別。這兩個實時打印的數字到屏幕上。 我在窗口中使用python 2.7.5。

這是爲什麼發生?

p.s.在另一個通過subprocess.PIPE而不是直接在屏幕上打印輸出的例子中,我確實觀察到了緩衝區的不同。

我錯過了什麼?

+0

可能有答案來解釋你所看到的,但是......有沒有你想要解決的具體問題,還是這種思想上的好奇心? – dkamins 2014-11-24 02:45:36

+0

您的操作系統最終將決定何時刷新。調用'flush'只是一種保證輸出緩衝區在特定時刻被刷新的方式,但即使沒有明確調用flush也可能被操作系統自動刷新。 – Doorknob 2014-11-24 02:46:22

+0

@dkamins你發現了我..這是出於好奇心,最初從一個真正的問題,我以某種方式解決但不知道如何。經過一些更多的閱讀和試​​驗後,我在這裏。 – enchy 2014-11-24 03:38:12

回答

2

使用flush一般會保證即發紅完成,但假設相反的關係是一個邏輯上的謬誤,類似於:

  1. 狗是動物。
  2. 這是一種動物。
  3. 因此,這是一隻狗。

換句話說,使用flush不保證沖洗也不會發生。有趣的是,在Win81中使用Cygwin下的Python 2.7.8,我看到了相反的行爲 - 所有東西都被分到最後。它可能與Windows本地Python不同,它也可能與IDLE內部不同。

+0

AKA「non sequitur」:) – Tico 2014-11-24 03:33:54

+0

然後是操作系統還是python版本?我使用win7。順便說一句,謝謝你的比喻。我沒有意識到flush() - > flush是之前的單向邏輯。 – enchy 2014-11-24 03:34:46

1

請參閱stdio buffering。簡言之:

默認緩衝模式:

  • 標準輸入總是緩衝
  • stderr中總是無緩衝
  • 如果stdout是終端然後緩衝自動設置爲行緩衝,否則它是設置爲緩衝

對我來說,你給的例子打印:

cmd

  • 所有在Cygwin的蟒蛇在出口編號
  • 一個個的Win32蟒蛇

mintty

  • 雙方都退出時
  • 兩者之一通過一個與-u選項
  • sys.stdout.isatty()返回False

因此,看起來像msvcrtstdout在它指向終端時是無緩衝的。一個簡單的C程序測試顯示了相同的行爲。

+0

我沒有做任何事情來禁用鏈接中提到的輸出緩衝。我使用python 2.7.5,我的流指向終端(是嗎?我從cmd窗口調用它)。 – enchy 2014-11-24 03:30:19