| import sys | |
| import builtins | |
| import code | |
| import lldb | |
| import traceback | |
| try: | |
| import readline | |
| import rlcompleter | |
| except ImportError: | |
| have_readline = False | |
| except AttributeError: | |
| # This exception gets hit by the rlcompleter when Linux is using | |
| # the readline suppression import. | |
| have_readline = False | |
| else: | |
| have_readline = True | |
| def is_libedit(): | |
| if hasattr(readline, "backend"): | |
| return readline.backend == "editline" | |
| return "libedit" in getattr(readline, "__doc__", "") | |
| if is_libedit(): | |
| readline.parse_and_bind("bind ^I rl_complete") | |
| else: | |
| readline.parse_and_bind("tab: complete") | |
| # When running one line, we might place the string to run in this string | |
| # in case it would be hard to correctly escape a string's contents | |
| g_run_one_line_str = None | |
| class LLDBExit(SystemExit): | |
| pass | |
| def strip_and_check_exit(line): | |
| line = line.rstrip() | |
| if line in ("exit", "quit"): | |
| raise LLDBExit | |
| return line | |
| def readfunc(prompt): | |
| line = input(prompt) | |
| return strip_and_check_exit(line) | |
| def readfunc_stdio(prompt): | |
| sys.stdout.write(prompt) | |
| sys.stdout.flush() | |
| line = sys.stdin.readline() | |
| # Readline always includes a trailing newline character unless the file | |
| # ends with an incomplete line. An empty line indicates EOF. | |
| if not line: | |
| raise EOFError | |
| return strip_and_check_exit(line) | |
| def run_python_interpreter(local_dict): | |
| # Pass in the dictionary, for continuity from one session to the next. | |
| try: | |
| banner = "Python Interactive Interpreter. To exit, type 'quit()', 'exit()'." | |
| input_func = readfunc_stdio | |
| is_atty = sys.stdin.isatty() | |
| if is_atty: | |
| banner = "Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D." | |
| input_func = readfunc | |
| code.interact(banner=banner, readfunc=input_func, local=local_dict) | |
| except LLDBExit: | |
| pass | |
| except SystemExit as e: | |
| if e.code: | |
| print("Script exited with code %s" % e.code) | |
| def run_one_line(local_dict, input_string): | |
| global g_run_one_line_str | |
| try: | |
| input_string = strip_and_check_exit(input_string) | |
| repl = code.InteractiveConsole(local_dict) | |
| if input_string: | |
| # A newline is appended to support one-line statements containing | |
| # control flow. For example "if True: print(1)" silently does | |
| # nothing, but works with a newline: "if True: print(1)\n". | |
| input_string += "\n" | |
| repl.runsource(input_string) | |
| elif g_run_one_line_str: | |
| repl.runsource(g_run_one_line_str) | |
| except LLDBExit: | |
| pass | |
| except SystemExit as e: | |
| if e.code: | |
| print("Script exited with code %s" % e.code) |