mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
	
	
		
			111 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			111 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() | ||
|  | 	 | ||
|  | 	 | ||
|  | 		 | ||
|  | 		 | ||
|  | 		 |