python中stdout輸出不緩衝的設定方法

來源:互聯網
上載者:User
考慮以下python程式:

代碼如下:


#!/usr/bin/env python

import sys

sys.stdout.write("stdout1 ")
sys.stderr.write("stderr1 ")
sys.stdout.write("stdout2 ")
sys.stderr.write("stderr2 ")


其中的sys.stdout.write也可以換成print。
運行這程式,你覺得會輸出什嗎?實驗一下,就會發現,其實輸出並不是

代碼如下:


stdout1 stderr1 stdout2 stderr2


而是:

代碼如下:


stderr1 stderr2 stdout1 stdout2


究其原因,是因為緩衝:雖然stderr和stdout預設都是指向螢幕的,但是stderr是無緩衝的,程式往stderr輸出一個字元,就會在螢幕上顯示一個;而stdout是有緩衝的,只有遇到換行或者積累到一定的大小,才會顯示出來。這就是為什麼上面的會顯示兩個stderr的原因了。
然而,有時候,你可能還是希望stdout的行為和stderr一樣,能不能實現呢?當然是可以的,而且對於python,實現起來還特別方便,以下是兩個方法:

代碼如下:


python -u stderr_stdout.py
PYTHONUNBUFFERED=1 python stderr_stdout.py


第一種方法是給python指定 -u 參數,第二種方法是在python運行時,指定 PYTHONUNBUFFERED 環境變數,這兩種方法其實是等效的。
當然,也可以在程式的第一行指定 #!/usr/bin/python -u 然後程式加可執行許可權來運行,或者把 export PYTHONUNBUFFERED=1 寫到 .bashrc 裡去。


附:stackoverflow上也有同學遇到類似問題,可以參考一下

地址:http://stackoverflow.com/questions/107705/python-output-buffering

被採納的代碼:

代碼如下:


class Unbuffered(object):
def __init__(self, stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
def __getattr__(self, attr):
return getattr(self.stream, attr)

import sys
sys.stdout = Unbuffered(sys.stdout)
print 'Hello'

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.