https://github.com/python/cpython/commit/b9179c354b9a77eb832fc4c861495b34915dfe3d
commit: b9179c354b9a77eb832fc4c861495b34915dfe3d
branch: 3.13
author: Miss Islington (bot) <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-08-23T09:33:58Z
summary:

[3.13] gh-137754: Fix import of zoneinfo if _datetime is not available 
(GH-137845) (GH-138085)

Both modules should use the Python implementation in that case.
(cherry picked from commit 6620ef0ff62dea2632bedf9afa88aa4780a2c9d9)

Co-authored-by: Serhiy Storchaka <[email protected]>

files:
A Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst
M Lib/test/test_zoneinfo/test_zoneinfo.py
M Lib/zoneinfo/__init__.py

diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py 
b/Lib/test/test_zoneinfo/test_zoneinfo.py
index d51736e34c60fc..f7bb2aa151c04a 100644
--- a/Lib/test/test_zoneinfo/test_zoneinfo.py
+++ b/Lib/test/test_zoneinfo/test_zoneinfo.py
@@ -21,6 +21,7 @@
 from test.test_zoneinfo import _support as test_support
 from test.test_zoneinfo._support import OS_ENV_LOCK, TZPATH_TEST_LOCK, 
ZoneInfoTestBase
 from test.support.import_helper import import_module, CleanImport
+from test.support.script_helper import assert_python_ok
 
 lzma = import_module('lzma')
 py_zoneinfo, c_zoneinfo = test_support.get_modules()
@@ -1960,6 +1961,26 @@ class CTestModule(TestModule):
     module = c_zoneinfo
 
 
+class MiscTests(unittest.TestCase):
+    def test_pydatetime(self):
+        # Test that zoneinfo works if the C implementation of datetime
+        # is not available and the Python implementation of datetime is used.
+        # The Python implementation of zoneinfo should be used in thet case.
+        #
+        # Run the test in a subprocess, as importing _zoneinfo with
+        # _datettime disabled causes crash in the previously imported
+        # _zoneinfo.
+        assert_python_ok('-c', '''if 1:
+            import sys
+            sys.modules['_datetime'] = None
+            import datetime
+            import zoneinfo
+            tzinfo = zoneinfo.ZoneInfo('Europe/London')
+            datetime.datetime(2025, 10, 26, 2, 0, tzinfo=tzinfo)
+            ''',
+            PYTHONTZPATH=str(ZONEINFO_DATA.tzpath))
+
+
 class ExtensionBuiltTest(unittest.TestCase):
     """Smoke test to ensure that the C and Python extensions are both tested.
 
diff --git a/Lib/zoneinfo/__init__.py b/Lib/zoneinfo/__init__.py
index f5510ee0497513..df2ae909f53cf2 100644
--- a/Lib/zoneinfo/__init__.py
+++ b/Lib/zoneinfo/__init__.py
@@ -12,7 +12,10 @@
 
 try:
     from _zoneinfo import ZoneInfo
-except ImportError:  # pragma: nocover
+except (ImportError, AttributeError):  # pragma: nocover
+    # AttributeError: module 'datetime' has no attribute 'datetime_CAPI'.
+    # This happens when the '_datetime' module is not available and the
+    # pure Python implementation is used instead.
     from ._zoneinfo import ZoneInfo
 
 reset_tzpath = _tzpath.reset_tzpath
diff --git 
a/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst 
b/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst
new file mode 100644
index 00000000000000..323870afd97106
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-08-16-09-02-11.gh-issue-137754.mCev1Y.rst
@@ -0,0 +1,2 @@
+Fix import of the :mod:`zoneinfo` module if the C implementation of the
+:mod:`datetime` module is not available.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to