]> granicus.if.org Git - python/commitdiff
Add Jeff Epler's interact() function. Note that it is broken.
authorGuido van Rossum <guido@python.org>
Tue, 7 Oct 1997 14:47:24 +0000 (14:47 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 7 Oct 1997 14:47:24 +0000 (14:47 +0000)
(It should probably be withdrawn :-( )

Lib/code.py

index 49fe541757ccc6de3703f06fa385e8852018489c..e01051e2889c4925dc449377278c14cbf527afd6 100644 (file)
@@ -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 @@ def compile_command(source, filename="<input>", symbol="single"):
        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()