Kaydet (Commit) 1b3904b9 authored tarafından Jack Jansen's avatar Jack Jansen

Module to buffer stdout/stderr until stdin is read. Useful for

windowing programs, together with option to keep console window closed
until needed.
üst 0b34dd51
"""quietconsole - A module to keep console I/O quiet but dump it when needed"""
import types
import sys
class _PseudoStdin:
def __init__(self, stdouterr):
self.keep_stdin = sys.stdin
sys.stdin = self
self.keep_stdouterr = stdouterr
def __del__(self):
self.keep_stdin = self.keep_stdouterr = None
def _revert(self):
"""Return to old state, with true stdio"""
if self.keep_stdin == None:
return
sys.stdin = self.keep_stdin
self.keep_stdin = None
self.keep_stdouterr._revert(1)
self.keep_stdouterr = None
def read(self, *args):
self._revert()
return apply(sys.stdin.read, args)
def readlines(self, *args):
self._revert()
return apply(sys.stdin.readlines, args)
def readline(self, *args):
self._revert()
return apply(sys.stdin.readline, args)
def close(self):
self._revert()
sys.stdin.close()
class _PseudoStdouterr:
def __init__(self):
self.keep_stdout = sys.stdout
self.keep_stderr = sys.stderr
sys.stdout = sys.stderr = self
self.data = []
def __del__(self):
self.keep_stdout = self.keep_stderr = None
def _revert(self, dumpdata=0):
if self.keep_stdout == None:
return
sys.stdout = self.keep_stdout
sys.stderr = self.keep_stderr
sys.keep_stdout = self.keep_stderr = None
if dumpdata and self.data:
for d in self.data:
sys.stdout.write(d)
self.data = None
def write(self, arg):
self.data.append(arg)
def writelines(self, arg):
for d in arg:
self.data.append(arg)
def close(self):
self.keep_stdout = self.keep_stderr = self.data = None
beenhere = 0
def install():
global beenhere
if beenhere:
return
beenhere = 1
# There's no point in re-installing if the console has been active
obj = _PseudoStdouterr()
_PseudoStdin(obj)
# No need to keep the objects, they're saved in sys.std{in,out,err}
def revert():
if type(sys.stdin) == types.FileType:
return # Not installed
sys.stdin._revert()
def _test():
import time
install()
print "You will not see this yet"
time.sleep(1)
print "You will not see this yet"
time.sleep(1)
print "You will not see this yet"
time.sleep(1)
print "You will not see this yet"
time.sleep(1)
print "You will not see this yet"
time.sleep(1)
print "5 seconds have passed, now you may type something"
rv = sys.stdin.readline()
print "You typed", rv
if __name__ == '__main__':
_test()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment