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