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)