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)