File: mergeall-products/unzipped/autoflush.py

"""
================================================================================
autoflush.py (part of Mergeall [3.1])

Force print()'s text to be unbuffered (i.e., flushed at each line end), by 
resetting the standard streams it uses in the sys module to a proxy object.

This module is used by scripts that wish to make output unbuffered when run 
as frozen executables, where Python's "-u" and PYTHONUNBUFFERED may not be
available (e.g., Mac apps).  diffall and cpall both use this code for "-u".

Alternatives: some freeze systems/versions may support Python switches or
always flush prints automatically, and the print() builtin may be reset to 
a custom version at startup (as done in mergeall.py: see its code). 
================================================================================
"""

import sys


class AutoFlush:
    """
    Stream proxy: flush lines as they are written.
    TBD: autoflush if text contains an endline too?
    """
    def __init__(self, stream):
        self.stream = stream
            
    def write(self, data):
        res = self.stream.write(data)
        if data.endswith('\n'):
            self.stream.flush()
        return res

    def __getattr__(self, attr):
        # and everything else
        return getattr(self.stream, attr)


def setFlushedOuput(): 
    """
    Reset streams to proxies globally.
    print() uses sys.stdout internally.
    """
    sys.stdout = AutoFlush(sys.stdout)
    sys.stderr = AutoFlush(sys.stderr)



[Home page] Books Code Blog Python Author Train Find ©M.Lutz