mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			116 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import string
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								import traceback
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								try:
							 | 
						||
| 
								 | 
							
									sys.ps1
							 | 
						||
| 
								 | 
							
								except AttributeError:
							 | 
						||
| 
								 | 
							
									sys.ps1 = ">>> "
							 | 
						||
| 
								 | 
							
								try:
							 | 
						||
| 
								 | 
							
									sys.ps2
							 | 
						||
| 
								 | 
							
								except AttributeError:
							 | 
						||
| 
								 | 
							
									sys.ps2 = "... "
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def print_exc(limit=None, file=None):
							 | 
						||
| 
								 | 
							
									if not file:
							 | 
						||
| 
								 | 
							
										file = sys.stderr
							 | 
						||
| 
								 | 
							
									# we're going to skip the outermost traceback object, we don't
							 | 
						||
| 
								 | 
							
									# want people to see the line which excecuted their code.
							 | 
						||
| 
								 | 
							
									tb = sys.exc_traceback
							 | 
						||
| 
								 | 
							
									if tb:
							 | 
						||
| 
								 | 
							
										tb = tb.tb_next
							 | 
						||
| 
								 | 
							
									try:
							 | 
						||
| 
								 | 
							
										sys.last_type = sys.exc_type
							 | 
						||
| 
								 | 
							
										sys.last_value = sys.exc_value
							 | 
						||
| 
								 | 
							
										sys.last_traceback = tb
							 | 
						||
| 
								 | 
							
										traceback.print_exception(sys.last_type, sys.last_value, 
							 | 
						||
| 
								 | 
							
													sys.last_traceback, limit, file)
							 | 
						||
| 
								 | 
							
									except:
							 | 
						||
| 
								 | 
							
										print '--- hola! ---'
							 | 
						||
| 
								 | 
							
										traceback.print_exception(sys.exc_type, sys.exc_value, 
							 | 
						||
| 
								 | 
							
													sys.exc_traceback, limit, file)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PyInteractive:
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def __init__(self):
							 | 
						||
| 
								 | 
							
										self._pybuf = ""
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									def executeline(self, stuff, out = None, env = None):
							 | 
						||
| 
								 | 
							
										if env is None:
							 | 
						||
| 
								 | 
							
											import __main__
							 | 
						||
| 
								 | 
							
											env = __main__.__dict__
							 | 
						||
| 
								 | 
							
										if out:
							 | 
						||
| 
								 | 
							
											saveerr, saveout = sys.stderr, sys.stdout
							 | 
						||
| 
								 | 
							
											sys.stderr = sys.stdout = out
							 | 
						||
| 
								 | 
							
										try:
							 | 
						||
| 
								 | 
							
											if self._pybuf:
							 | 
						||
| 
								 | 
							
												self._pybuf = self._pybuf + '\n' + stuff
							 | 
						||
| 
								 | 
							
											else:
							 | 
						||
| 
								 | 
							
												self._pybuf = stuff
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											# Compile three times: as is, with \n, and with \n\n appended.
							 | 
						||
| 
								 | 
							
											# If it compiles as is, it's complete.  If it compiles with
							 | 
						||
| 
								 | 
							
											# one \n appended, we expect more.  If it doesn't compile
							 | 
						||
| 
								 | 
							
											# either way, we compare the error we get when compiling with
							 | 
						||
| 
								 | 
							
											# \n or \n\n appended.  If the errors are the same, the code
							 | 
						||
| 
								 | 
							
											# is broken.  But if the errors are different, we expect more.
							 | 
						||
| 
								 | 
							
											# Not intuitive; not even guaranteed to hold in future
							 | 
						||
| 
								 | 
							
											# releases; but this matches the compiler's behavior in Python
							 | 
						||
| 
								 | 
							
											# 1.4 and 1.5.
							 | 
						||
| 
								 | 
							
											err = err1 = err2 = None
							 | 
						||
| 
								 | 
							
											code = code1 = code2 = None
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											# quickly get out of here when the line is 'empty' or is a comment
							 | 
						||
| 
								 | 
							
											stripped = string.strip(self._pybuf)
							 | 
						||
| 
								 | 
							
											if not stripped or stripped[0] == '#':
							 | 
						||
| 
								 | 
							
												self._pybuf = ''
							 | 
						||
| 
								 | 
							
												sys.stdout.write(sys.ps1)
							 | 
						||
| 
								 | 
							
												sys.stdout.flush()
							 | 
						||
| 
								 | 
							
												return
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											try:
							 | 
						||
| 
								 | 
							
												code = compile(self._pybuf, "<input>", "single")
							 | 
						||
| 
								 | 
							
											except SyntaxError, err:
							 | 
						||
| 
								 | 
							
												pass
							 | 
						||
| 
								 | 
							
											except:
							 | 
						||
| 
								 | 
							
												# OverflowError. More?
							 | 
						||
| 
								 | 
							
												print_exc()
							 | 
						||
| 
								 | 
							
												self._pybuf = ""
							 | 
						||
| 
								 | 
							
												sys.stdout.write(sys.ps1)
							 | 
						||
| 
								 | 
							
												sys.stdout.flush()
							 | 
						||
| 
								 | 
							
												return
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											try:
							 | 
						||
| 
								 | 
							
												code1 = compile(self._pybuf + "\n", "<input>", "single")
							 | 
						||
| 
								 | 
							
											except SyntaxError, err1:
							 | 
						||
| 
								 | 
							
												pass
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											try:
							 | 
						||
| 
								 | 
							
												code2 = compile(self._pybuf + "\n\n", "<input>", "single")
							 | 
						||
| 
								 | 
							
											except SyntaxError, err2:
							 | 
						||
| 
								 | 
							
												pass
							 | 
						||
| 
								 | 
							
											
							 | 
						||
| 
								 | 
							
											if code:
							 | 
						||
| 
								 | 
							
												try:
							 | 
						||
| 
								 | 
							
													exec code in env
							 | 
						||
| 
								 | 
							
												except:
							 | 
						||
| 
								 | 
							
													print_exc()
							 | 
						||
| 
								 | 
							
												self._pybuf = ""
							 | 
						||
| 
								 | 
							
											elif code1:
							 | 
						||
| 
								 | 
							
												pass
							 | 
						||
| 
								 | 
							
											elif err1 == err2 or (not stuff and self._pybuf):
							 | 
						||
| 
								 | 
							
												print_exc()
							 | 
						||
| 
								 | 
							
												self._pybuf = ""
							 | 
						||
| 
								 | 
							
											if self._pybuf:
							 | 
						||
| 
								 | 
							
												sys.stdout.write(sys.ps2)
							 | 
						||
| 
								 | 
							
												sys.stdout.flush()
							 | 
						||
| 
								 | 
							
											else:
							 | 
						||
| 
								 | 
							
												sys.stdout.write(sys.ps1)
							 | 
						||
| 
								 | 
							
												sys.stdout.flush()
							 | 
						||
| 
								 | 
							
										finally:
							 | 
						||
| 
								 | 
							
											if out:
							 | 
						||
| 
								 | 
							
												sys.stderr, sys.stdout = saveerr, saveout
							 |