]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-125096: Don't import _pyrepl in site if PYTHON_BASIC_REPL (#125097)
authorVictor Stinner <vstinner@python.org>
Tue, 8 Oct 2024 13:48:40 +0000 (15:48 +0200)
committerGitHub <noreply@github.com>
Tue, 8 Oct 2024 13:48:40 +0000 (15:48 +0200)
If the PYTHON_BASIC_REPL environment variable is set, the site module
no longer imports the _pyrepl module.

Moreover, the site module now respects -E and -I command line
options: ignore PYTHON_BASIC_REPL in this case.

Lib/site.py
Lib/test/test_pyrepl/test_pyrepl.py
Misc/NEWS.d/next/Library/2024-10-08-13-28-22.gh-issue-125096.Vz0W5g.rst [new file with mode: 0644]

index cafd3ab70b2cac2addd0d18f71c05c78a68f9f9f..b3194d79fb5ab88aaf3200680d9c102a137d0145 100644 (file)
@@ -491,12 +491,21 @@ def register_readline():
     This can be overridden in the sitecustomize or usercustomize module,
     or in a PYTHONSTARTUP file.
     """
+    if not sys.flags.ignore_environment:
+        PYTHON_BASIC_REPL = os.getenv("PYTHON_BASIC_REPL")
+    else:
+        PYTHON_BASIC_REPL = False
+
     import atexit
     try:
         import readline
         import rlcompleter  # noqa: F401
-        import _pyrepl.readline
-        import _pyrepl.unix_console
+        if PYTHON_BASIC_REPL:
+            CAN_USE_PYREPL = False
+        else:
+            import _pyrepl.readline
+            import _pyrepl.unix_console
+            from _pyrepl.main import CAN_USE_PYREPL
     except ImportError:
         return
 
@@ -517,7 +526,6 @@ def register_readline():
         pass
 
     if readline.get_current_history_length() == 0:
-        from _pyrepl.main import CAN_USE_PYREPL
         # If no history was loaded, default to .python_history,
         # or PYTHON_HISTORY.
         # The guard is necessary to avoid doubling history size at
@@ -525,13 +533,17 @@ 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:
-            readline_module = readline
-        else:
+
+        if CAN_USE_PYREPL:
             readline_module = _pyrepl.readline
+            exceptions = (OSError, *_pyrepl.unix_console._error)
+        else:
+            readline_module = readline
+            exceptions = OSError
+
         try:
             readline_module.read_history_file(history)
-        except (OSError,* _pyrepl.unix_console._error):
+        except exceptions:
             pass
 
         def write_history():
index 36f940eaea4eac10f05fa80cfd5167819061d924..1a76832386bf1dd4dd5c7e92bd1bf5fab5ef5211 100644 (file)
@@ -1204,6 +1204,18 @@ class TestMain(ReplTestCase):
         self.assertNotIn("Exception", output)
         self.assertNotIn("Traceback", output)
 
+        # The site module must not load _pyrepl if PYTHON_BASIC_REPL is set
+        commands = ("import sys\n"
+                    "print('_pyrepl' in sys.modules)\n"
+                    "exit()\n")
+        env["PYTHON_BASIC_REPL"] = "1"
+        output, exit_code = self.run_repl(commands, env=env)
+        self.assertEqual(exit_code, 0)
+        self.assertIn("False", output)
+        self.assertNotIn("True", output)
+        self.assertNotIn("Exception", output)
+        self.assertNotIn("Traceback", output)
+
     @force_not_colorized
     def test_bad_sys_excepthook_doesnt_crash_pyrepl(self):
         env = os.environ.copy()
diff --git a/Misc/NEWS.d/next/Library/2024-10-08-13-28-22.gh-issue-125096.Vz0W5g.rst b/Misc/NEWS.d/next/Library/2024-10-08-13-28-22.gh-issue-125096.Vz0W5g.rst
new file mode 100644 (file)
index 0000000..c582a2d
--- /dev/null
@@ -0,0 +1,5 @@
+If the :envvar:`PYTHON_BASIC_REPL` environment variable is set, the
+:mod:`site` module no longer imports the :mod:`!_pyrepl` module. Moreover,
+the :mod:`site` module now respects :option:`-E` and :option:`-I` command
+line options: ignore :envvar:`PYTHON_BASIC_REPL` in this case. Patch by
+Victor Stinner.