diff --git a/Lib/_pyrepl/main.py b/Lib/_pyrepl/main.py index 041a4009f42ed8..2f4e983543644f 100644 --- a/Lib/_pyrepl/main.py +++ b/Lib/_pyrepl/main.py @@ -7,10 +7,26 @@ else: CAN_USE_PYREPL = sys.getwindowsversion().build >= 10586 # Windows 10 TH2 +FAIL_MSG = "" +try: + import errno + 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: + FAIL_MSG = f"warning: can't use pyrepl: {e}" + CAN_USE_PYREPL = False + def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): global CAN_USE_PYREPL if not CAN_USE_PYREPL: + if not os.environ.get('PYTHON_BASIC_REPL', None): + from .trace import trace + trace(FAIL_MSG) + print(FAIL_MSG, file=sys.stderr) return sys._baserepl() if mainmodule: @@ -34,22 +50,5 @@ def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): if not hasattr(sys, "ps2"): sys.ps2 = "... " - run_interactive = None - try: - import errno - 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) - from .simple_interact import run_multiline_interactive_console - run_interactive = run_multiline_interactive_console - except Exception as e: - from .trace import trace - msg = f"warning: can't use pyrepl: {e}" - trace(msg) - print(msg, file=sys.stderr) - CAN_USE_PYREPL = False - if run_interactive is None: - return sys._baserepl() - run_interactive(namespace) + from .simple_interact import run_multiline_interactive_console + run_multiline_interactive_console(namespace) diff --git a/Lib/site.py b/Lib/site.py index daa56e158949db..d21473fb8766eb 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -509,6 +509,10 @@ def register_readline(): pass if readline.get_current_history_length() == 0: + try: + from _pyrepl.main import CAN_USE_PYREPL + except ImportError: + CAN_USE_PYREPL = False # If no history was loaded, default to .python_history, # or PYTHON_HISTORY. # The guard is necessary to avoid doubling history size at @@ -516,28 +520,22 @@ def register_readline(): # through a PYTHONSTARTUP hook, see: # http://bugs.python.org/issue5845#msg198636 history = gethistoryfile() + if os.getenv("PYTHON_BASIC_REPL") or not CAN_USE_PYREPL: + my_readline = readline + else: + my_readline = _pyrepl.readline try: - if os.getenv("PYTHON_BASIC_REPL"): - readline.read_history_file(history) - else: - _pyrepl.readline.read_history_file(history) + my_readline.read_history_file(history) except (OSError,* _pyrepl.unix_console._error): pass def write_history(): try: - from _pyrepl.main import CAN_USE_PYREPL - except ImportError: - CAN_USE_PYREPL = False - - try: - if os.getenv("PYTHON_BASIC_REPL") or not CAN_USE_PYREPL: - readline.write_history_file(history) - else: - _pyrepl.readline.write_history_file(history) + my_readline.write_history_file(history) except (FileNotFoundError, PermissionError): # home directory does not exist or is not writable # https://bugs.python.org/issue19891 + # or terminal doesn't have the required capability pass atexit.register(write_history)