[3.13] gh-129098: avoid using content of _pyrepl/__main__.py when reporting tracebacks (GH-130721) (#132755)

gh-129098: avoid using content of `_pyrepl/__main__.py` when reporting tracebacks (GH-130721)
(cherry picked from commit 492e3e6976)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2025-04-20 19:48:16 +02:00 committed by GitHub
parent 5ab628fc65
commit 62663bfed5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 33 additions and 2 deletions

View file

@ -1,6 +1,10 @@
# Important: don't add things to this module, as they will end up in the REPL's
# default globals. Use _pyrepl.main instead.
# Avoid caching this file by linecache and incorrectly report tracebacks.
# See https://github.com/python/cpython/issues/129098.
__spec__ = __loader__ = None
if __name__ == "__main__":
from .main import interactive_console as __pyrepl_interactive_console
__pyrepl_interactive_console()

View file

@ -11,9 +11,9 @@ import tempfile
from unittest import TestCase, skipUnless, skipIf
from unittest.mock import patch
from test.support import force_not_colorized, make_clean_env
from test.support import SHORT_TIMEOUT
from test.support import SHORT_TIMEOUT, STDLIB_DIR
from test.support.import_helper import import_module
from test.support.os_helper import unlink
from test.support.os_helper import EnvironmentVarGuard, unlink
from .support import (
FakeConsole,
@ -1216,6 +1216,31 @@ class TestMain(ReplTestCase):
self.assertNotIn("Exception", output)
self.assertNotIn("Traceback", output)
@force_not_colorized
def test_no_pyrepl_source_in_exc(self):
# Avoid using _pyrepl/__main__.py in traceback reports
# See https://github.com/python/cpython/issues/129098.
pyrepl_main_file = os.path.join(STDLIB_DIR, "_pyrepl", "__main__.py")
self.assertTrue(os.path.exists(pyrepl_main_file), pyrepl_main_file)
with open(pyrepl_main_file) as fp:
excluded_lines = fp.readlines()
excluded_lines = list(filter(None, map(str.strip, excluded_lines)))
for filename in ['?', 'unknown-filename', '<foo>', '<...>']:
self._test_no_pyrepl_source_in_exc(filename, excluded_lines)
def _test_no_pyrepl_source_in_exc(self, filename, excluded_lines):
with EnvironmentVarGuard() as env, self.subTest(filename=filename):
env.unset("PYTHON_BASIC_REPL")
commands = (f"eval(compile('spam', {filename!r}, 'eval'))\n"
f"exit()\n")
output, _ = self.run_repl(commands, env=env)
self.assertIn("Traceback (most recent call last)", output)
self.assertIn("NameError: name 'spam' is not defined", output)
for line in excluded_lines:
with self.subTest(line=line):
self.assertNotIn(line, output)
@force_not_colorized
def test_bad_sys_excepthook_doesnt_crash_pyrepl(self):
env = os.environ.copy()

View file

@ -0,0 +1,2 @@
Fix REPL traceback reporting when using :func:`compile` with an inexisting
file. Patch by Bénédikt Tran.