https://github.com/python/cpython/commit/6620ef0ff62dea2632bedf9afa88aa4780a2c9d9
commit: 6620ef0ff62dea2632bedf9afa88aa4780a2c9d9
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-08-23T12:12:13+03:00
summary:
gh-137754: Fix import of zoneinfo if _datetime is not available (GH-137845)
Both modules should use the Python implementation in that case.
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 44e87e71c8ee7b..addc905af5ede9 100644
--- a/Lib/test/test_zoneinfo/test_zoneinfo.py
+++ b/Lib/test/test_zoneinfo/test_zoneinfo.py
@@ -22,6 +22,7 @@
from test.test_zoneinfo import _support as test_support
from test.test_zoneinfo._support import 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()
@@ -1946,6 +1947,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]