]> granicus.if.org Git - python/commitdiff
Module to buffer stdout/stderr until stdin is read. Useful for
authorJack Jansen <jack.jansen@cwi.nl>
Fri, 20 Jun 1997 16:22:07 +0000 (16:22 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Fri, 20 Jun 1997 16:22:07 +0000 (16:22 +0000)
windowing programs, together with option to keep console window closed
until needed.

Mac/Lib/quietconsole.py [new file with mode: 0644]

diff --git a/Mac/Lib/quietconsole.py b/Mac/Lib/quietconsole.py
new file mode 100644 (file)
index 0000000..21e7755
--- /dev/null
@@ -0,0 +1,110 @@
+"""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()
+       
+       
+               
+               
+