mirror of
				https://github.com/python/cpython.git
				synced 2025-10-28 04:04:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			110 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """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()
 | |
| 	
 | |
| 	
 | |
| 		
 | |
| 		
 | |
| 		
 | 
