diff Lib/code.py @ 6423:644484e1a37b legacy-trunk

Add Jeff Epler's interact() function. Note that it is broken. (It should probably be withdrawn :-( )
author Guido van Rossum <guido@python.org>
date Tue, 07 Oct 1997 14:47:24 +0000
parents b9063f6f811c
children 00a85ab0337f
line wrap: on
line diff
--- a/Lib/code.py	Tue Oct 07 14:45:49 1997 +0000
+++ b/Lib/code.py	Tue Oct 07 14:47:24 1997 +0000
@@ -1,3 +1,5 @@
+# XXX This is broken with class exceptions
+
 """Utilities dealing with code objects."""
 
 def compile_command(source, filename="<input>", symbol="single"):
@@ -50,3 +52,53 @@
 	return code
     if not code1 and err1 == err2:
 	raise SyntaxError, err1
+
+
+def interact(banner=None, readfunc=raw_input, local=None):
+    # Due to Jeff Epler, with changes by Guido:
+    """Closely emulate the interactive Python console."""
+    try: import readline # Enable GNU readline if available
+    except: pass
+    local = local or {}
+    import sys, string, traceback
+    sys.ps1 = '>>> '
+    sys.ps2 = '... '
+    if banner:
+	print banner
+    else:
+	print "Python Interactive Console", sys.version
+	print sys.copyright
+    buf = []
+    while 1:
+	if buf: prompt = sys.ps2
+	else: prompt = sys.ps1
+	try: line = readfunc(prompt)
+	except KeyboardInterrupt:
+	    print "\nKeyboardInterrupt"
+	    buf = []
+	    continue
+	except EOFError: break
+	buf.append(line)
+	try: x = compile_command(string.join(buf, "\n"))
+	except SyntaxError:
+	    traceback.print_exc(0)
+	    buf = []
+	    continue
+	if x == None: continue
+	else:
+	    try: exec x in local
+	    except:
+		exc_type, exc_value, exc_traceback = \
+			sys.exc_type, sys.exc_value, \
+			sys.exc_traceback
+		l = len(traceback.extract_tb(sys.exc_traceback))
+		try: 1/0
+		except:
+		    m = len(traceback.extract_tb(
+			    sys.exc_traceback))
+		traceback.print_exception(exc_type,
+			exc_value, exc_traceback, l-m)
+	    buf = []
+		
+if __name__ == '__main__':
+    interact()