Home | History | Annotate | Download | only in Interpreter
      1 import readline
      2 import code
      3 import sys
      4 import traceback
      5 
      6 class SimpleREPL(code.InteractiveConsole):
      7    def __init__(self, prompt, dict):
      8        code.InteractiveConsole.__init__(self,dict)
      9        self.prompt = prompt
     10        self.loop_exit = False
     11        self.dict = dict
     12 
     13    def interact(self):
     14        try:
     15            sys.ps1
     16        except AttributeError:
     17            sys.ps1 = ">>> "
     18        try:
     19            sys.ps2
     20        except AttributeError:
     21            sys.ps2 = "... "
     22 
     23        while not self.loop_exit:
     24            try:
     25                self.read_py_command()
     26            except (SystemExit, EOFError):
     27                # EOF while in Python just breaks out to top level.
     28                self.write('\n')
     29                self.loop_exit = True
     30                break
     31            except KeyboardInterrupt:
     32                self.write("\nKeyboardInterrupt\n")
     33                self.resetbuffer()
     34                more = 0
     35            except:
     36                traceback.print_exc()
     37 
     38    def process_input (self, in_str):
     39       # Canonicalize the format of the input string
     40       temp_str = in_str
     41       temp_str.strip(' \t')
     42       words = temp_str.split()
     43       temp_str = ('').join(words)
     44 
     45       # Check the input string to see if it was the quit
     46       # command.  If so, intercept it, so that it doesn't
     47       # close stdin on us!
     48       if (temp_str.lower() == "quit()" or temp_str.lower() == "exit()"):
     49          self.loop_exit = True
     50          in_str = "raise SystemExit "
     51       return in_str
     52 
     53    def my_raw_input (self, prompt):
     54       stream = sys.stdout
     55       stream.write (prompt)
     56       stream.flush ()
     57       try:
     58          line = sys.stdin.readline()
     59       except KeyboardInterrupt:
     60          line = " \n"
     61       except (SystemExit, EOFError):
     62          line = "quit()\n"
     63       if not line:
     64          raise EOFError
     65       if line[-1] == '\n':
     66          line = line[:-1]
     67       return line
     68 
     69    def read_py_command(self):
     70        # Read off a complete Python command.
     71        more = 0
     72        while 1:
     73            if more:
     74                prompt = sys.ps2
     75            else:
     76                prompt = sys.ps1
     77            line = self.my_raw_input(prompt)
     78            # Can be None if sys.stdin was redefined
     79            encoding = getattr(sys.stdin, "encoding", None)
     80            if encoding and not isinstance(line, unicode):
     81                line = line.decode(encoding)
     82            line = self.process_input (line)
     83            more = self.push(line)
     84            if not more:
     85                break
     86 
     87    def one_line (self, input):
     88       line = self.process_input (input)
     89       more = self.push(line)
     90       if more:
     91          self.write ("Input not a complete line.")
     92          self.resetbuffer()
     93          more = 0
     94 
     95 def run_python_interpreter (dict):
     96    # Pass in the dictionary, for continuity from one session to the next.
     97    repl = SimpleREPL('>>> ', dict)
     98    repl.interact()
     99 
    100 def run_one_line (dict, input_string):
    101    repl = SimpleREPL ('', dict)
    102    repl.one_line (input_string)
    103 
    104