diff options
Diffstat (limited to 'Lib/code.py')
-rw-r--r-- | Lib/code.py | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/Lib/code.py b/Lib/code.py index 49fe541..e01051e 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -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() |