gh-125096: Don't import _pyrepl in site if PYTHON_BASIC_REPL (#125097)

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.
This commit is contained in:
Victor Stinner 2024-10-08 15:48:40 +02:00 committed by GitHub
parent 5967dd8a4d
commit 65ce228d63
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 36 additions and 7 deletions

View File

@ -491,12 +491,21 @@ def register_readline():
This can be overridden in the sitecustomize or usercustomize module, This can be overridden in the sitecustomize or usercustomize module,
or in a PYTHONSTARTUP file. 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 import atexit
try: try:
import readline import readline
import rlcompleter # noqa: F401 import rlcompleter # noqa: F401
if PYTHON_BASIC_REPL:
CAN_USE_PYREPL = False
else:
import _pyrepl.readline import _pyrepl.readline
import _pyrepl.unix_console import _pyrepl.unix_console
from _pyrepl.main import CAN_USE_PYREPL
except ImportError: except ImportError:
return return
@ -517,7 +526,6 @@ def register_readline():
pass pass
if readline.get_current_history_length() == 0: if readline.get_current_history_length() == 0:
from _pyrepl.main import CAN_USE_PYREPL
# If no history was loaded, default to .python_history, # If no history was loaded, default to .python_history,
# or PYTHON_HISTORY. # or PYTHON_HISTORY.
# The guard is necessary to avoid doubling history size at # The guard is necessary to avoid doubling history size at
@ -525,13 +533,17 @@ def register_readline():
# through a PYTHONSTARTUP hook, see: # through a PYTHONSTARTUP hook, see:
# http://bugs.python.org/issue5845#msg198636 # http://bugs.python.org/issue5845#msg198636
history = gethistoryfile() history = gethistoryfile()
if os.getenv("PYTHON_BASIC_REPL") or not CAN_USE_PYREPL:
readline_module = readline if CAN_USE_PYREPL:
else:
readline_module = _pyrepl.readline readline_module = _pyrepl.readline
exceptions = (OSError, *_pyrepl.unix_console._error)
else:
readline_module = readline
exceptions = OSError
try: try:
readline_module.read_history_file(history) readline_module.read_history_file(history)
except (OSError,* _pyrepl.unix_console._error): except exceptions:
pass pass
def write_history(): def write_history():

View File

@ -1204,6 +1204,18 @@ class TestMain(ReplTestCase):
self.assertNotIn("Exception", output) self.assertNotIn("Exception", output)
self.assertNotIn("Traceback", 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 @force_not_colorized
def test_bad_sys_excepthook_doesnt_crash_pyrepl(self): def test_bad_sys_excepthook_doesnt_crash_pyrepl(self):
env = os.environ.copy() env = os.environ.copy()

View File

@ -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.