]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-154199: Soft-deprecate `ctypes.util.find_msvcrt` (GH-154553)
authorPeter Bierma <zintensitydev@gmail.com>
Sat, 25 Jul 2026 14:08:55 +0000 (10:08 -0400)
committerGitHub <noreply@github.com>
Sat, 25 Jul 2026 14:08:55 +0000 (10:08 -0400)
Doc/library/ctypes.rst
Lib/ctypes/util.py
Misc/NEWS.d/next/Library/2026-07-23-13-09-25.gh-issue-154199.hmBfrS.rst [new file with mode: 0644]

index a4de7cb09cca9daf194b3409d53f4deb8d0aeb77..acd6c2f97348e19dc33f987e6e17f3c013030b62 100644 (file)
@@ -1866,6 +1866,10 @@ like ``find_library("c")`` will fail and return ``None``.
 
    .. availability:: Windows
 
+   .. soft-deprecated:: 3.16
+      This function now always returns ``None``, as there are no more
+      VC runtime DLLs that are a single file and supported by Microsoft.
+
 
 .. _ctypes-listing-loaded-shared-libraries:
 
index 52c1dbf9cd8cee317ada870c56fe89f42f050bdf..c0a578c86549ec96a6fd7cc76fede628712d83ac 100644 (file)
@@ -13,56 +13,19 @@ lazy from ctypes import Structure, BigEndianStructure, LittleEndianStructure
 
 # find_library(name) returns the pathname of a library, or None.
 if os.name == "nt":
-
-    def _get_build_version():
-        """Return the version of MSVC that was used to build Python.
-
-        For Python 2.3 and up, the version number is included in
-        sys.version.  For earlier versions, assume the compiler is MSVC 6.
-        """
-        # This function was copied from Lib/distutils/msvccompiler.py
-        prefix = "MSC v."
-        i = sys.version.find(prefix)
-        if i == -1:
-            return 6
-        i = i + len(prefix)
-        s, rest = sys.version[i:].split(" ", 1)
-        majorVersion = int(s[:-2]) - 6
-        if majorVersion >= 13:
-            majorVersion += 1
-        minorVersion = int(s[2:3]) / 10.0
-        # I don't think paths are affected by minor version in version 6
-        if majorVersion == 6:
-            minorVersion = 0
-        if majorVersion >= 6:
-            return majorVersion + minorVersion
-        # else we don't know what version of the compiler this is
-        return None
-
     def find_msvcrt():
-        """Return the name of the VC runtime dll"""
-        version = _get_build_version()
-        if version is None:
-            # better be safe than sorry
-            return None
-        if version <= 6:
-            clibname = 'msvcrt'
-        elif version <= 13:
-            clibname = 'msvcr%d' % (version * 10)
-        else:
-            # CRT is no longer directly loadable. See issue23606 for the
-            # discussion about alternative approaches.
-            return None
-
-        # If python was built with in debug mode
-        import importlib.machinery
-        if '_d.pyd' in importlib.machinery.EXTENSION_SUFFIXES:
-            clibname += 'd'
-        return clibname+'.dll'
+        """Return the name of the VC runtime dll.
+           This is soft deprecated as of Python 3.16."""
+        # See gh-154199. In short, this function wasn't able to return
+        # newer msvcrt versions (because there was no single msvcrt DLL),
+        # and the versions that are a single DLL are no longer supported
+        # by Microsoft.
+        return None
 
     def find_library(name):
         if name in ('c', 'm'):
-            return find_msvcrt()
+            # See gh-67794; there is no single VC runtime DLL anymore.
+            return None
         # See MSDN for the REAL search order.
         for directory in os.environ['PATH'].split(os.pathsep):
             fname = os.path.join(directory, name)
diff --git a/Misc/NEWS.d/next/Library/2026-07-23-13-09-25.gh-issue-154199.hmBfrS.rst b/Misc/NEWS.d/next/Library/2026-07-23-13-09-25.gh-issue-154199.hmBfrS.rst
new file mode 100644 (file)
index 0000000..3746394
--- /dev/null
@@ -0,0 +1,2 @@
+Make :func:`ctypes.util.find_msvcrt` always return ``None`` for
+compatibility reasons.