如何強制將Python的打印功能輸出到屏幕? html
這不是「 禁用輸出緩衝」的重複項-連接的問題正在嘗試無緩衝輸出,儘管這更廣泛。 對於這個問題,最重要的答案太過強大或牽扯太多(對於這個問題,它們不是很好的答案),這個問題能夠由相對新手在Google上找到。 python
在Python 3上, print
可使用可選的flush
參數 函數
print("Hello world!", flush=True)
在Python 2上,您必須作 spa
import sys sys.stdout.flush()
在調用print
。 默認狀況下, print
打印到sys.stdout
(有關文件對象的更多信息,請參閱文檔)。 命令行
運行python -h
,我看到一個命令行選項 : code
-u:無緩衝的二進制stdout和stderr; 也PYTHONUNBUFFERED = x有關與'-u'有關的內部緩衝的詳細信息,請參見手冊頁 htm
這是相關的文檔 。 對象
使用-u
命令行開關能夠工做,可是有點笨拙。 這意味着若是用戶在不使用-u
選項的狀況下調用腳本,則該程序可能會出現錯誤的行爲。 我一般使用自定義stdout
,以下所示: 繼承
class flushfile: def __init__(self, f): self.f = f def write(self, x): self.f.write(x) self.f.flush() import sys sys.stdout = flushfile(sys.stdout)
...如今,您的全部print
調用(隱式使用sys.stdout
)將被自動flush
。 文檔
從Python 3.3開始,您能夠強制正常的print()
函數刷新,而無需使用sys.stdout.flush()
; 只需將「 flush」關鍵字參數設置爲true。 從文檔中 :
print(* objects,sep ='',end ='\\ n',file = sys.stdout,flush = False)
將對象打印到流文件中,以sep分隔,而後以end分隔。 sep,end和file(若是存在)必須做爲關鍵字參數給出。
全部非關鍵字參數都將像str()同樣轉換爲字符串,並寫入流中,以sep分隔,而後以end分隔。 sep和end都必須是字符串; 它們也能夠是None,這意味着要使用默認值。 若是沒有給出對象,print()只會寫完。
file參數必須是帶有write(string)方法的對象; 若是不存在或沒有,將使用sys.stdout。 一般是否由文件決定是否對輸出進行緩衝,可是若是flush關鍵字參數爲true,則將強制刷新流。
丹的想法不太奏效:
#!/usr/bin/env python class flushfile(file): def __init__(self, f): self.f = f def write(self, x): self.f.write(x) self.f.flush() import sys sys.stdout = flushfile(sys.stdout) print "foo"
結果:
Traceback (most recent call last): File "./passpersist.py", line 12, in <module> print "foo" ValueError: I/O operation on closed file
我認爲問題在於它是從文件類繼承的,其實是沒必要要的。 根據sys.stdout的文檔:
stdout和stderr沒必要是內置文件對象:任何對象均可以接受,只要它具備帶有字符串參數的write()方法便可。
因此改變
class flushfile(file):
至
class flushfile(object):
使它工做正常。