124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerimport readline 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerimport code 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerimport sys 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerimport traceback 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SimpleREPL(code.InteractiveConsole): 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner def __init__(self, prompt, dict): 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner code.InteractiveConsole.__init__(self,dict) 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.prompt = prompt 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.loop_exit = False 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.dict = dict 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner def interact(self): 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner try: 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sys.ps1 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner except AttributeError: 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sys.ps1 = ">>> " 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner try: 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sys.ps2 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner except AttributeError: 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sys.ps2 = "... " 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while not self.loop_exit: 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner try: 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.read_py_command() 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner except (SystemExit, EOFError): 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner # EOF while in Python just breaks out to top level. 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.write('\n') 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.loop_exit = True 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner except KeyboardInterrupt: 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.write("\nKeyboardInterrupt\n") 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.resetbuffer() 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner more = 0 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner except: 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner traceback.print_exc() 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner def process_input (self, in_str): 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner # Canonicalize the format of the input string 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner temp_str = in_str 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner temp_str.strip(' \t') 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner words = temp_str.split() 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner temp_str = ('').join(words) 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner # Check the input string to see if it was the quit 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner # command. If so, intercept it, so that it doesn't 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner # close stdin on us! 48a8a5e562db734341149365d2bf7fd501365ed701Jason Molenda if (temp_str.lower() == "quit()" or temp_str.lower() == "exit()"): 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner self.loop_exit = True 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner in_str = "raise SystemExit " 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return in_str 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner def my_raw_input (self, prompt): 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner stream = sys.stdout 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner stream.write (prompt) 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner stream.flush () 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner try: 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line = sys.stdin.readline() 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner except KeyboardInterrupt: 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line = " \n" 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner except (SystemExit, EOFError): 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line = "quit()\n" 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if not line: 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner raise EOFError 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if line[-1] == '\n': 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line = line[:-1] 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return line 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner def read_py_command(self): 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner # Read off a complete Python command. 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner more = 0 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while 1: 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if more: 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner prompt = sys.ps2 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else: 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner prompt = sys.ps1 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line = self.my_raw_input(prompt) 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner # Can be None if sys.stdin was redefined 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner encoding = getattr(sys.stdin, "encoding", None) 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if encoding and not isinstance(line, unicode): 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line = line.decode(encoding) 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line = self.process_input (line) 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner more = self.push(line) 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if not more: 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 870aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice def one_line (self, input): 880aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice line = self.process_input (input) 890aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice more = self.push(line) 900aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice if more: 910aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice self.write ("Input not a complete line.") 920aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice self.resetbuffer() 930aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice more = 0 940aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdef run_python_interpreter (dict): 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner # Pass in the dictionary, for continuity from one session to the next. 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner repl = SimpleREPL('>>> ', dict) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner repl.interact() 990aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 1000aa2e55f0e9422405ad33675adc1e35044537adbCaroline Ticedef run_one_line (dict, input_string): 1010aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice repl = SimpleREPL ('', dict) 1020aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice repl.one_line (input_string) 1030aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 104