15d42b5b74d6d9745e35c7cae13ce9147e1616784Guido van Rossum"""Utilities needed to emulate Python's interactive interpreter. 25227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 35227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum""" 41557a7314c52c5e8b5b026ec21aeaad137c9cd69Guido van Rossum 598d9fd3e68075ce6fe7642ed8793c1abee69edf6Guido van Rossum# Inspired by similar code by Jeff Epler and Fredrik Lundh. 698d9fd3e68075ce6fe7642ed8793c1abee69edf6Guido van Rossum 75d42b5b74d6d9745e35c7cae13ce9147e1616784Guido van Rossum 8a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossumimport sys 9a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossumimport traceback 10007a90317d154536f68278a69743418d8301ca3fAlexander Belopolskyimport argparse 116cd6a82db93fa37a13d0b5312ce6510c4d6967deTim Petersfrom codeop import CommandCompiler, compile_command 1290981e0e70450bfb58f0d83d4e4d00a4a7d4d5d9Guido van Rossum 136cd6a82db93fa37a13d0b5312ce6510c4d6967deTim Peters__all__ = ["InteractiveInterpreter", "InteractiveConsole", "interact", 14e99d5ea25ba994491c773d9b5872332334ccd1c5Skip Montanaro "compile_command"] 15e99d5ea25ba994491c773d9b5872332334ccd1c5Skip Montanaro 165227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossumclass InteractiveInterpreter: 175227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """Base class for InteractiveConsole. 185227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 195227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum This class deals with parsing and interpreter state (the user's 205227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum namespace); it doesn't deal with input buffering or prompting or 215227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum input file naming (the filename is always passed in explicitly). 22a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 23a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """ 24a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 255227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum def __init__(self, locals=None): 26a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """Constructor. 27a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 285227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum The optional 'locals' argument specifies the dictionary in 295227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum which code will be executed; it defaults to a newly created 305227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum dictionary with key "__name__" set to "__console__" and key 315227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum "__doc__" set to None. 32a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 33a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """ 34a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum if locals is None: 355227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum locals = {"__name__": "__console__", "__doc__": None} 36a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum self.locals = locals 376cd6a82db93fa37a13d0b5312ce6510c4d6967deTim Peters self.compile = CommandCompiler() 38a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 395227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum def runsource(self, source, filename="<input>", symbol="single"): 405227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """Compile and run some source in the interpreter. 41a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 425227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum Arguments are as for compile_command(). 43a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 445227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum One several things can happen: 45a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 465227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1) The input is incorrect; compile_command() raised an 475227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum exception (SyntaxError or OverflowError). A syntax traceback 485227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum will be printed by calling the showsyntaxerror() method. 49a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 50a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 2) The input is incomplete, and more input is required; 515227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum compile_command() returned None. Nothing happens. 52a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 53a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 3) The input is complete; compile_command() returned a code 545227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum object. The code is executed by calling self.runcode() (which 555227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum also handles run-time exceptions, except for SystemExit). 56a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 57bc0e9108261693b6278687f4fb4709ff76c2e543Tim Peters The return value is True in case 2, False in the other cases (unless 585227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum an exception is raised). The return value can be used to 595227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum decide whether to use sys.ps1 or sys.ps2 to prompt the next 605227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum line. 61a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 62a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """ 63a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum try: 646cd6a82db93fa37a13d0b5312ce6510c4d6967deTim Peters code = self.compile(source, filename, symbol) 6548450cf0a94765c010eddfbbfc5c85380e6a9a15Guido van Rossum except (OverflowError, SyntaxError, ValueError): 66a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum # Case 1 675227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.showsyntaxerror(filename) 68bc0e9108261693b6278687f4fb4709ff76c2e543Tim Peters return False 69a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 705227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum if code is None: 71a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum # Case 2 72bc0e9108261693b6278687f4fb4709ff76c2e543Tim Peters return True 73a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 74a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum # Case 3 755227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.runcode(code) 76bc0e9108261693b6278687f4fb4709ff76c2e543Tim Peters return False 775227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 785227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum def runcode(self, code): 795227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """Execute a code object. 805227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 815227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum When an exception occurs, self.showtraceback() is called to 825227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum display a traceback. All exceptions are caught except 835227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum SystemExit, which is reraised. 845227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 855227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum A note about KeyboardInterrupt: this exception may occur 865227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum elsewhere in this code, and may not always be caught. The 875227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum caller should be prepared to deal with it. 885227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 895227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """ 90a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum try: 917cae87ca7b0a3a7ce497cbd335c8ec82fe680476Georg Brandl exec(code, self.locals) 92a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum except SystemExit: 93a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum raise 94a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum except: 95a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum self.showtraceback() 96a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 975227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum def showsyntaxerror(self, filename=None): 98a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """Display the syntax error that just occurred. 99a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 100a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum This doesn't display a stack trace because there isn't one. 101a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 1025227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum If a filename is given, it is stuffed in the exception instead 1035227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum of what was there before (because Python's parser always uses 1045227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum "<string>" when reading from a string). 1055227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 106a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum The output is written by self.write(), below. 107a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 108a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """ 1098bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan type, value, tb = sys.exc_info() 1105227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum sys.last_type = type 1115227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum sys.last_value = value 1128bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan sys.last_traceback = tb 1135227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum if filename and type is SyntaxError: 1145227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum # Work hard to stuff the correct filename in the exception 115a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum try: 11633d2689fc900a814f0a7d2f846abe0c34024ae17Guido van Rossum msg, (dummy_filename, lineno, offset, line) = value.args 11733d2689fc900a814f0a7d2f846abe0c34024ae17Guido van Rossum except ValueError: 1185227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum # Not the format we expect; leave it alone 1195227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum pass 1205227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum else: 1215227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum # Stuff in the right filename 1220679a73c0ec3ddf46f42b8c7d09d97730bd386cdSkip Montanaro value = SyntaxError(msg, (filename, lineno, offset, line)) 123c7745d4b54f020e60ad3b56efd6e775d9d4873d4Fred Drake sys.last_value = value 1248bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan if sys.excepthook is sys.__excepthook__: 1258bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan lines = traceback.format_exception_only(type, value) 1268bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan self.write(''.join(lines)) 1278bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan else: 1288bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan # If someone has set sys.excepthook, we let that take precedence 1298bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan # over self.write 1308bd24fe9ff1c4d5dd3929465fc208b1375c32981Nick Coghlan sys.excepthook(type, value, tb) 131a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 132a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum def showtraceback(self): 133a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """Display the exception that just occurred. 134a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 135a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum We remove the first stack item because it is our own code. 136a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 137a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum The output is written by self.write(), below. 138a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 139a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """ 140c31e6227f94c2bb0290336c739873173672a8991R David Murray sys.last_type, sys.last_value, last_tb = ei = sys.exc_info() 141c31e6227f94c2bb0290336c739873173672a8991R David Murray sys.last_traceback = last_tb 142a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum try: 1432f0441f03f71c658148bff60be46585f56670d1fRobert Collins lines = traceback.format_exception(ei[0], ei[1], last_tb.tb_next) 1442f0441f03f71c658148bff60be46585f56670d1fRobert Collins if sys.excepthook is sys.__excepthook__: 1452f0441f03f71c658148bff60be46585f56670d1fRobert Collins self.write(''.join(lines)) 1462f0441f03f71c658148bff60be46585f56670d1fRobert Collins else: 1472f0441f03f71c658148bff60be46585f56670d1fRobert Collins # If someone has set sys.excepthook, we let that take precedence 1482f0441f03f71c658148bff60be46585f56670d1fRobert Collins # over self.write 1492f0441f03f71c658148bff60be46585f56670d1fRobert Collins sys.excepthook(ei[0], ei[1], last_tb) 150a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum finally: 1512f0441f03f71c658148bff60be46585f56670d1fRobert Collins last_tb = ei = None 152a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 153a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum def write(self, data): 154a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """Write a string. 155a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 156a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum The base implementation writes to sys.stderr; a subclass may 157a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum replace this with a different implementation. 158a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 159a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """ 160a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum sys.stderr.write(data) 161a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 1625227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1635227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossumclass InteractiveConsole(InteractiveInterpreter): 1645227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """Closely emulate the behavior of the interactive Python interpreter. 1655227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1665227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum This class builds on InteractiveInterpreter and adds prompting 1675227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum using the familiar sys.ps1 and sys.ps2, and input buffering. 1685227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1695227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """ 1705227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1715227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum def __init__(self, locals=None, filename="<console>"): 1725227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """Constructor. 1735227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1745227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum The optional locals argument will be passed to the 1755227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum InteractiveInterpreter base class. 1765227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1775227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum The optional filename argument should specify the (file)name 1785227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum of the input stream; it will show up in tracebacks. 1795227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1805227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """ 1815227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum InteractiveInterpreter.__init__(self, locals) 1825227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.filename = filename 1835227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.resetbuffer() 1845227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1855227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum def resetbuffer(self): 1865227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """Reset the input buffer.""" 1875227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.buffer = [] 1885227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1896877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano def interact(self, banner=None, exitmsg=None): 1905227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """Closely emulate the interactive Python console. 1915227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 19233d2689fc900a814f0a7d2f846abe0c34024ae17Guido van Rossum The optional banner argument specifies the banner to print 1935227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum before the first interaction; by default it prints a banner 1945227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum similar to the one printed by the real Python interpreter, 1955227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum followed by the current class name in parentheses (so as not 1965227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum to confuse this with the real interpreter -- since it's so 1975227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum close!). 1985227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 1996877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano The optional exitmsg argument specifies the exit message 2006877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano printed when exiting. Pass the empty string to suppress 2016877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano printing an exit message. If exitmsg is not given or None, 2026877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano a default message is printed. 2036877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano 2045227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """ 2055227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum try: 2065227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum sys.ps1 2075227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum except AttributeError: 2085227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum sys.ps1 = ">>> " 2095227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum try: 2105227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum sys.ps2 2115227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum except AttributeError: 2125227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum sys.ps2 = "... " 213acb29aed679cfcf97becb3b54a993046b2eeca65Skip Montanaro cprt = 'Type "help", "copyright", "credits" or "license" for more information.' 2145227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum if banner is None: 2155227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.write("Python %s on %s\n%s\n(%s)\n" % 216c5f15b088fd30157fb587079d47086295b7ed52bGuido van Rossum (sys.version, sys.platform, cprt, 2175227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.__class__.__name__)) 218fbc3c3c2bed34350e0dde4771805c51b80f2e410Georg Brandl elif banner: 2195227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.write("%s\n" % str(banner)) 2205227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum more = 0 2215227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum while 1: 2225227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum try: 2235227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum if more: 2245227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum prompt = sys.ps2 2255227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum else: 2265227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum prompt = sys.ps1 2275227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum try: 2285227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum line = self.raw_input(prompt) 2295227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum except EOFError: 2305227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.write("\n") 2315227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum break 2325227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum else: 2335227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum more = self.push(line) 2345227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum except KeyboardInterrupt: 2355227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.write("\nKeyboardInterrupt\n") 2365227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.resetbuffer() 2375227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum more = 0 2386877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano if exitmsg is None: 2396877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano self.write('now exiting %s...\n' % self.__class__.__name__) 2406877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano elif exitmsg != '': 2416877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano self.write('%s\n' % exitmsg) 2425227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 2435227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum def push(self, line): 2445227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """Push a line to the interpreter. 2455227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 2465227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum The line should not have a trailing newline; it may have 2475227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum internal newlines. The line is appended to a buffer and the 2485227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum interpreter's runsource() method is called with the 2495227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum concatenated contents of the buffer as source. If this 2505227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum indicates that the command was executed or invalid, the buffer 2515227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum is reset; otherwise, the command is incomplete, and the buffer 2525227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum is left as it was after the line was appended. The return 2535227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum value is 1 if more input is required, 0 if the line was dealt 2545227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum with in some way (this is the same as runsource()). 2555227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 2565227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum """ 2575227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.buffer.append(line) 2586b71e747b19c41e0665ee14eb755c924a40dd774Eric S. Raymond source = "\n".join(self.buffer) 2595227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum more = self.runsource(source, self.filename) 2605227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum if not more: 2615227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum self.resetbuffer() 2625227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum return more 2635227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 264a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum def raw_input(self, prompt=""): 265a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """Write a prompt and read a line. 266a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 267a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum The returned line does not include the trailing newline. 268a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum When the user enters the EOF key sequence, EOFError is raised. 269a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 27083210b9ea032798ec36e3630b261f262526c5f97Guido van Rossum The base implementation uses the built-in function 27183210b9ea032798ec36e3630b261f262526c5f97Guido van Rossum input(); a subclass may replace this with a different 27283210b9ea032798ec36e3630b261f262526c5f97Guido van Rossum implementation. 273a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 274a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """ 27583210b9ea032798ec36e3630b261f262526c5f97Guido van Rossum return input(prompt) 276ce96f69d69a6020c780145c89a17a8391b63624bNeal Norwitz 277a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 278a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 2796877ed3560aef64391657f634cbe00d16023201aSteven D'Apranodef interact(banner=None, readfunc=None, local=None, exitmsg=None): 280a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """Closely emulate the interactive Python interpreter. 281a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 282a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum This is a backwards compatible interface to the InteractiveConsole 2835227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum class. When readfunc is not specified, it attempts to import the 2845227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum readline module to enable GNU readline if it is available. 285a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 286a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum Arguments (all optional, all default to None): 287a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 288a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum banner -- passed to InteractiveConsole.interact() 289a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum readfunc -- if not None, replaces InteractiveConsole.raw_input() 290d90ae19b92b6172f5b1aceb34c5c18ca28144ca7Guido van Rossum local -- passed to InteractiveInterpreter.__init__() 2916877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano exitmsg -- passed to InteractiveConsole.interact() 292a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum 293a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum """ 294d90ae19b92b6172f5b1aceb34c5c18ca28144ca7Guido van Rossum console = InteractiveConsole(local) 295a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum if readfunc is not None: 296a93b848e330fca3fd04edbfdda6eae4ed5b3097dGuido van Rossum console.raw_input = readfunc 2975227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum else: 2985227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum try: 2995227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum import readline 300cd171c8e92c10d327151400fd8f16b11a4964615Brett Cannon except ImportError: 3015227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum pass 3026877ed3560aef64391657f634cbe00d16023201aSteven D'Aprano console.interact(banner, exitmsg) 3035227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 3045227f0fdcd99d90acdd712f96ea5cd2d7331c53fGuido van Rossum 305f6489f941c7ad37751a597fc664c3f9946e8a0c3Benjamin Petersonif __name__ == "__main__": 306007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky parser = argparse.ArgumentParser() 307007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky parser.add_argument('-q', action='store_true', 308007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky help="don't print version and copyright messages") 309007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky args = parser.parse_args() 310007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky if args.q or sys.flags.quiet: 311007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky banner = '' 312007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky else: 313007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky banner = None 314007a90317d154536f68278a69743418d8301ca3fAlexander Belopolsky interact(banner) 315