如何刷新打印功能的輸出?

如何強制將Python的打印功能輸出到屏幕? html

這不是「 禁用輸出緩衝」的重複項-連接的問題正在嘗試無緩衝輸出,儘管這更廣泛。 對於這個問題,最重要的答案太過強大或牽扯太多(對於這個問題,它們不是很好的答案),這個問題能夠由相對新手在Google上找到。 python


#1樓

在Python 3上, print可使用可選的flush參數 函數

print("Hello world!", flush=True)

在Python 2上,您必須作 spa

import sys
sys.stdout.flush()

在調用print 。 默認狀況下, print打印到sys.stdout (有關文件對象的更多信息,請參閱文檔)。 命令行


#2樓

運行python -h ,我看到一個命令行選項code

-u:無緩衝的二進制stdout和stderr; 也PYTHONUNBUFFERED = x有關與'-u'有關的內部緩衝的詳細信息,請參見手冊頁 htm

這是相關的文檔對象


#3樓

使用-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文檔


#4樓

從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,則將強制刷新流。


#5樓

丹的想法不太奏效:

#!/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):

使它工做正常。

相關文章
相關標籤/搜索