]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-144727: Add test for circular lazy import crash (#144727) (#144838)
authorPablo Galindo Salgado <Pablogsal@gmail.com>
Sun, 15 Feb 2026 18:36:47 +0000 (18:36 +0000)
committerGitHub <noreply@github.com>
Sun, 15 Feb 2026 18:36:47 +0000 (18:36 +0000)
Add a regression test ensuring that circular lazy imports raise a proper
error (ImportCycleError) instead of crashing with a segfault. The crash
was fixed in gh-144733 but no test was added at the time.

Lib/test/test_import/test_lazy_imports.py

index 1193af9589034b912c0cd1c5dae4398f334a061f..a4c9c14ae2b5f86f7aa820c052938e3b3a99e31b 100644 (file)
@@ -8,6 +8,8 @@ import textwrap
 import threading
 import types
 import unittest
+import tempfile
+import os
 
 try:
     import _testcapi
@@ -598,6 +600,39 @@ class ErrorHandlingTests(unittest.TestCase):
         self.assertEqual(result.returncode, 0, f"stdout: {result.stdout}, stderr: {result.stderr}")
         self.assertIn("OK", result.stdout)
 
+    def test_circular_lazy_import_does_not_crash_for_gh_144727(self):
+        with tempfile.TemporaryDirectory() as tmpdir:
+            a_path = os.path.join(tmpdir, "a.py")
+            b_path = os.path.join(tmpdir, "b.py")
+
+            with open(a_path, "w") as f:
+                f.write(textwrap.dedent("""\
+                    lazy import b
+
+                    def something():
+                        b.hello()
+
+                    something()
+                """))
+
+            with open(b_path, "w") as f:
+                f.write(textwrap.dedent("""\
+                    lazy import a
+
+                    def hello():
+                        print(a)
+                """))
+
+            result = subprocess.run(
+                [sys.executable, a_path],
+                capture_output=True,
+                text=True,
+                cwd=tmpdir,
+            )
+            # Should get a proper Python error, not a crash
+            self.assertEqual(result.returncode, 1)
+            self.assertIn("Error", result.stderr)
+
 
 class GlobalsAndDictTests(unittest.TestCase):
     """Tests for globals() and __dict__ behavior with lazy imports.