From 1328b5e7da3f908be350ff101a0ec95140a74bca Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Sat, 6 Jul 2024 06:46:38 +0300 Subject: [PATCH] gh-121245: Refactor site.register_readline() also initialize CAN_USE_PYREPL at import from _pyrepl.main --- Lib/_pyrepl/main.py | 39 +++++++++---------- Lib/site.py | 23 +++++------ ...-07-13-06-23-24.gh-issue-121245.RfOgf4.rst | 3 ++ 3 files changed, 32 insertions(+), 33 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2024-07-13-06-23-24.gh-issue-121245.RfOgf4.rst diff --git a/Lib/_pyrepl/main.py b/Lib/_pyrepl/main.py index 041a4009f42ed8..aaa0763cc03b0b 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 + global CAN_USE_PYREPL, FAIL_MSG 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..b54e9f22f5cad8 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,25 +520,18 @@ 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 diff --git a/Misc/NEWS.d/next/Library/2024-07-13-06-23-24.gh-issue-121245.RfOgf4.rst b/Misc/NEWS.d/next/Library/2024-07-13-06-23-24.gh-issue-121245.RfOgf4.rst new file mode 100644 index 00000000000000..1758f587157f36 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-07-13-06-23-24.gh-issue-121245.RfOgf4.rst @@ -0,0 +1,3 @@ +Simplify handling of the history file in ``site.register_readline()`` +helper. The ``CAN_USE_PYREPL`` variable now will be initialized, when +imported. Patch by Sergey B Kirpichev.