]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-139707: Better `ModuleNotFoundError` message for missing stdlib modules (GH-140219)
authorStan Ulbrych <89152624+StanFromIreland@users.noreply.github.com>
Tue, 21 Oct 2025 07:12:04 +0000 (08:12 +0100)
committerGitHub <noreply@github.com>
Tue, 21 Oct 2025 07:12:04 +0000 (09:12 +0200)
Lib/test/test_traceback.py
Lib/traceback.py
Misc/NEWS.d/next/Library/2025-10-16-16-10-11.gh-issue-139707.zR6Qtn.rst [new file with mode: 0644]

index bd3ecfd9a3863dafa279d1583acd5c66640d6331..bf57867a8715c043a43f7cbb2a8a01972b15a79f 100644 (file)
@@ -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
index 692d44837936ee897da2c526d9274cb4dd565000..9b4b8c7d566fe81845abd6bbe42c76397412d27d 100644 (file)
@@ -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 (file)
index 0000000..c5460aa
--- /dev/null
@@ -0,0 +1,2 @@
+Improve :exc:`ModuleNotFoundError` error message when a :term:`standard library`
+module is missing.