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,
|
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():
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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