From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Tue, 21 Oct 2025 07:12:04 +0000 (+0100) Subject: gh-139707: Better `ModuleNotFoundError` message for missing stdlib modules (GH-140219) X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=47d2f68df215b5bcbc76a50d3f4e0b68791e3e79;p=thirdparty%2FPython%2Fcpython.git gh-139707: Better `ModuleNotFoundError` message for missing stdlib modules (GH-140219) --- diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index bd3ecfd9a386..bf57867a8715 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -5034,7 +5034,8 @@ class MiscTest(unittest.TestCase): self.assertIn( (b"Site initialization is disabled, did you forget to " - b"add the site-packages directory to sys.path?"), stderr + b"add the site-packages directory to sys.path " + b"or to enable your virtual environment?"), stderr ) code = """ @@ -5046,9 +5047,20 @@ class MiscTest(unittest.TestCase): self.assertNotIn( (b"Site initialization is disabled, did you forget to " - b"add the site-packages directory to sys.path?"), stderr + b"add the site-packages directory to sys.path " + b"or to enable your virtual environment?"), stderr ) + def test_missing_stdlib_package(self): + code = """ + import sys + sys.stdlib_module_names |= {'spam'} + import spam + """ + _, _, stderr = assert_python_failure('-S', '-c', code) + + self.assertIn(b"Standard library module 'spam' was not found", stderr) + class TestColorizedTraceback(unittest.TestCase): maxDiff = None diff --git a/Lib/traceback.py b/Lib/traceback.py index 692d44837936..9b4b8c7d566f 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -1107,11 +1107,14 @@ class TracebackException: suggestion = _compute_suggestion_error(exc_value, exc_traceback, wrong_name) if suggestion: self._str += f". Did you mean: '{suggestion}'?" - elif exc_type and issubclass(exc_type, ModuleNotFoundError) and \ - sys.flags.no_site and \ - getattr(exc_value, "name", None) not in sys.stdlib_module_names: - self._str += (". Site initialization is disabled, did you forget to " - + "add the site-packages directory to sys.path?") + elif exc_type and issubclass(exc_type, ModuleNotFoundError): + module_name = getattr(exc_value, "name", None) + if module_name in sys.stdlib_module_names: + self._str = f"Standard library module '{module_name}' was not found" + elif sys.flags.no_site: + self._str += (". Site initialization is disabled, did you forget to " + + "add the site-packages directory to sys.path " + + "or to enable your virtual environment?") elif exc_type and issubclass(exc_type, (NameError, AttributeError)) and \ getattr(exc_value, "name", None) is not None: wrong_name = getattr(exc_value, "name", None) diff --git a/Misc/NEWS.d/next/Library/2025-10-16-16-10-11.gh-issue-139707.zR6Qtn.rst b/Misc/NEWS.d/next/Library/2025-10-16-16-10-11.gh-issue-139707.zR6Qtn.rst new file mode 100644 index 000000000000..c5460aae8b36 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-16-16-10-11.gh-issue-139707.zR6Qtn.rst @@ -0,0 +1,2 @@ +Improve :exc:`ModuleNotFoundError` error message when a :term:`standard library` +module is missing.