import errno import os import sys CAN_USE_PYREPL: bool FAIL_REASON: str try: if sys.platform == "win32" and sys.getwindowsversion().build < 10586: raise RuntimeError("Windows 10 TH2 or later required") if not os.isatty(sys.stdin.fileno()): raise OSError(errno.ENOTTY, "tty required", "stdin") from .simple_interact import check if err := check(): raise RuntimeError(err) except Exception as e: CAN_USE_PYREPL = False FAIL_REASON = f"warning: can't use pyrepl: {e}" else: CAN_USE_PYREPL = True FAIL_REASON = "" def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): if not CAN_USE_PYREPL: if not os.getenv('PYTHON_BASIC_REPL') and FAIL_REASON: from .trace import trace trace(FAIL_REASON) print(FAIL_REASON, file=sys.stderr) return sys._baserepl() if mainmodule: namespace = mainmodule.__dict__ else: import __main__ namespace = __main__.__dict__ namespace.pop("__pyrepl_interactive_console", None) # sys._baserepl() above does this internally, we do it here startup_path = os.getenv("PYTHONSTARTUP") if pythonstartup and startup_path: sys.audit("cpython.run_startup", startup_path) import tokenize with tokenize.open(startup_path) as f: startup_code = compile(f.read(), startup_path, "exec") exec(startup_code, namespace) # set sys.{ps1,ps2} just before invoking the interactive interpreter. This # mimics what CPython does in pythonrun.c if not hasattr(sys, "ps1"): sys.ps1 = ">>> " if not hasattr(sys, "ps2"): sys.ps2 = "... " from .console import InteractiveColoredConsole from .simple_interact import run_multiline_interactive_console console = InteractiveColoredConsole(namespace, filename="") run_multiline_interactive_console(console)