1import readline
2import code
3import sys
4import traceback
5
6class 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
95def 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
100def run_one_line (dict, input_string):
101   repl = SimpleREPL ('', dict)
102   repl.one_line (input_string)
103
104