mirror of https://github.com/python/cpython
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:
parent
5967dd8a4d
commit
65ce228d63
22
Lib/site.py
22
Lib/site.py
|
@ -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
|
||||
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():
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue