]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-140041: Fix import of `ctypes` on Android and Cygwin when ABI flags are...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 15 Oct 2025 22:03:25 +0000 (00:03 +0200)
committerGitHub <noreply@github.com>
Wed, 15 Oct 2025 22:03:25 +0000 (22:03 +0000)
Use sysconfig to determine the full name of libpython, rather than hardcoding
a library name that doesn't have ABI flags.
(cherry picked from commit 7f371ed84ba471bb1b11e79b502f244a9c17ac84)

Co-authored-by: Malcolm Smith <smith@chaquo.com>
Android/testbed/app/build.gradle.kts
Lib/ctypes/__init__.py
Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst [new file with mode: 0644]

index 92cffd61f86876e51feca4374bbca87ac28926b0..4de628a279ca3f7610ebc7f357a3fad8ec961ad5 100644 (file)
@@ -47,7 +47,7 @@ for ((i, prefix) in prefixes.withIndex()) {
     val libDir = file("$prefix/lib")
     val version = run {
         for (filename in libDir.list()!!) {
-            """python(\d+\.\d+)""".toRegex().matchEntire(filename)?.let {
+            """python(\d+\.\d+[a-z]*)""".toRegex().matchEntire(filename)?.let {
                 return@run it.groupValues[1]
             }
         }
@@ -64,9 +64,10 @@ for ((i, prefix) in prefixes.withIndex()) {
     val libPythonDir = file("$libDir/python$pythonVersion")
     val triplet = run {
         for (filename in libPythonDir.list()!!) {
-            """_sysconfigdata__android_(.+).py""".toRegex().matchEntire(filename)?.let {
-                return@run it.groupValues[1]
-            }
+            """_sysconfigdata_[a-z]*_android_(.+).py""".toRegex()
+                .matchEntire(filename)?.let {
+                    return@run it.groupValues[1]
+                }
         }
         throw GradleException("Failed to find Python triplet in $libPythonDir")
     }
index 7350e157ac70b57d6eee7f5ccc552aeda832a392..80651dc64ce72ae8f3ff2d38339007458a4cd05f 100644 (file)
@@ -1,6 +1,8 @@
 """create and manipulate C data types in Python"""
 
-import os as _os, sys as _sys
+import os as _os
+import sys as _sys
+import sysconfig as _sysconfig
 import types as _types
 
 __version__ = "1.1.0"
@@ -484,10 +486,9 @@ pydll = LibraryLoader(PyDLL)
 
 if _os.name == "nt":
     pythonapi = PyDLL("python dll", None, _sys.dllhandle)
-elif _sys.platform == "android":
-    pythonapi = PyDLL("libpython%d.%d.so" % _sys.version_info[:2])
-elif _sys.platform == "cygwin":
-    pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2])
+elif _sys.platform in ["android", "cygwin"]:
+    # These are Unix-like platforms which use a dynamically-linked libpython.
+    pythonapi = PyDLL(_sysconfig.get_config_var("LDLIBRARY"))
 else:
     pythonapi = PyDLL(None)
 
diff --git a/Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst b/Misc/NEWS.d/next/Library/2025-10-15-21-42-13.gh-issue-140041._Fka2j.rst
new file mode 100644 (file)
index 0000000..243ff39
--- /dev/null
@@ -0,0 +1 @@
+Fix import of :mod:`ctypes` on Android and Cygwin when ABI flags are present.