https://github.com/python/cpython/commit/ada9da94bf431445db1f2ef1a7207d3b4f428c25
commit: ada9da94bf431445db1f2ef1a7207d3b4f428c25
branch: main
author: Peter Bierma <[email protected]>
committer: ZeroIntensity <[email protected]>
date: 2026-07-25T10:08:55-04:00
summary:

gh-154199: Soft-deprecate `ctypes.util.find_msvcrt` (GH-154553)

files:
A Misc/NEWS.d/next/Library/2026-07-23-13-09-25.gh-issue-154199.hmBfrS.rst
M Doc/library/ctypes.rst
M Lib/ctypes/util.py

diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index a4de7cb09cca9d..acd6c2f97348e1 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -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:
 
diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
index 52c1dbf9cd8cee..c0a578c86549ec 100644
--- a/Lib/ctypes/util.py
+++ b/Lib/ctypes/util.py
@@ -13,56 +13,19 @@
 
 # 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
index 00000000000000..37463944a5de51
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-07-23-13-09-25.gh-issue-154199.hmBfrS.rst
@@ -0,0 +1,2 @@
+Make :func:`ctypes.util.find_msvcrt` always return ``None`` for
+compatibility reasons.

_______________________________________________
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