2012-04-04 637 views

回答

107

Python的標準輸出被緩衝(意味着它在將數據寫入終端之前收集一些「寫入」標準的數據)。調用sys.stdout.flush()強制它「刷新」緩衝區,這意味着它會將緩衝區中的所有內容寫入終端,即使通常它會在這樣做之前等待。

下面是關於(UN)緩衝I/O一些好的信息,以及它爲什麼有用:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

+2

這不能在Windows上工作! – 2014-08-16 13:53:06

+0

@Ciastopiekarz我們可以做些什麼來緩衝窗口上的緩衝區? – helplessKirk 2015-11-10 16:41:59

+0

@Ciastopiekarz你怎麼看?如果我使用Andrew Clark的Python腳本,並用'sys.stdout.write(「%d」%i)'替換打印行,那麼我必須取消對「sys.stdout.flush()'的調用以獲取當腳本執行時顯示緩衝區。 – 2016-04-25 04:35:02

71

考慮以下簡單的Python腳本:

import time 
import sys 

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

這是爲了打印一個數每秒五秒鐘,但如果你運行它,因爲它是現在(取決於默認的系統緩存),你可能在腳本完成之前不會看到任何輸出,然後一次性顯示0 1 2 3 4將打印到屏幕上。

這是因爲輸出被緩衝,除非您在每個print之後刷新sys.stdout,否則不會立即看到輸出。從sys.stdout.flush()行刪除評論以查看差異。

+20

在Python 3.x中,'print i'應該被print(i, end =''),因爲Python 3中的print()有一個默認前綴end ='\ n',它提示控制檯刷新。 – 2014-08-02 17:53:46

+0

我只是有這個問題!非常感謝你澄清爲什麼解決它! – 2017-10-23 19:43:39

3

按我的理解,當曾經我們執行打印語句輸出將被寫入緩衝。當緩衝區被刷新(清除)時,我們將在屏幕上看到輸出。默認情況下,當程序退出時,緩衝區將被刷新。但我們也可以通過在程序中使用「sys.stdout.flush()」語句來手動刷新緩衝區。在下面的代碼中,當i的值達到5時,緩衝區將被刷新。

你可以通過執行下面的代碼來理解。

藏羚羊@在線:〜$貓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() 

藏羚羊@在線:〜$

*****輸出*****

藏羚羊@在線: 〜$蟒蛇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 

藏羚羊@在線:〜$

0
import sys 
for x in range(10000): 
    print "HAPPY >> %s <<\r" % str(x), 
    sys.stdout.flush()