pythonstdoutoutput-buffering

Disable output buffering


Is output buffering enabled by default in Python's interpreter for sys.stdout?

If the answer is positive, what are all the ways to disable it?

Suggestions so far:

  1. Use the -u command line switch
  2. Wrap sys.stdout in an object that flushes after every write
  3. Set PYTHONUNBUFFERED env var
  4. sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Is there any other way to set some global flag in sys/sys.stdout programmatically during execution?


If you just want to flush after a specific write using print, see How can I flush the output of the print function?.


Solution

  • From Magnus Lycka answer on a mailing list:

    You can skip buffering for a whole python process using python -u or by setting the environment variable PYTHONUNBUFFERED.

    You could also replace sys.stdout with some other stream like wrapper which does a flush after every call.

    class Unbuffered(object):
       def __init__(self, stream):
           self.stream = stream
       def write(self, data):
           self.stream.write(data)
           self.stream.flush()
       def writelines(self, datas):
           self.stream.writelines(datas)
           self.stream.flush()
       def __getattr__(self, attr):
           return getattr(self.stream, attr)
    
    import sys
    sys.stdout = Unbuffered(sys.stdout)
    print 'Hello'