aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authormrh1997 <robert.hoelzl@posteo.de>2023-02-05 18:36:57 +0100
committerGitHub <noreply@github.com>2023-02-05 23:06:57 +0530
commitf7e9fbacb250ad9df95d0024161b40dfdc9cc39e (patch)
tree5451f3cff3d0f30dc567788af2be7e9012957312
parent90d85a9b4136aa1feb02f88aab614a3c29f20ed3 (diff)
downloadcpython-f7e9fbacb250ad9df95d0024161b40dfdc9cc39e.tar.gz
cpython-f7e9fbacb250ad9df95d0024161b40dfdc9cc39e.zip
bpo-33591: Add support for path like objects to `ctypes.CDLL` (#7032)
Co-authored-by: Oleg Iarygin <oleg@arhadthedev.net>
-rw-r--r--Doc/library/ctypes.rst16
-rw-r--r--Lib/ctypes/__init__.py2
-rw-r--r--Lib/test/test_ctypes/test_loading.py18
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS.d/next/Library/2018-05-21-17-18-00.gh-issue-77772.Fhg84L.rst3
5 files changed, 36 insertions, 4 deletions
diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index 0642bbe9f99..8fd681286b8 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -1380,6 +1380,10 @@ way is to instantiate one of the following classes:
DLLs and determine which one is not found using Windows debugging and
tracing tools.
+ .. versionchanged:: 3.12
+
+ The *name* parameter can now be a :term:`path-like object`.
+
.. seealso::
`Microsoft DUMPBIN tool <https://docs.microsoft.com/cpp/build/reference/dependents>`_
@@ -1398,6 +1402,10 @@ way is to instantiate one of the following classes:
.. versionchanged:: 3.3
:exc:`WindowsError` used to be raised.
+ .. versionchanged:: 3.12
+
+ The *name* parameter can now be a :term:`path-like object`.
+
.. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None)
@@ -1405,6 +1413,10 @@ way is to instantiate one of the following classes:
functions in these libraries use the ``stdcall`` calling convention, and are
assumed to return :c:expr:`int` by default.
+ .. versionchanged:: 3.12
+
+ The *name* parameter can now be a :term:`path-like object`.
+
The Python :term:`global interpreter lock` is released before calling any
function exported by these libraries, and reacquired afterwards.
@@ -1418,6 +1430,10 @@ function exported by these libraries, and reacquired afterwards.
Thus, this is only useful to call Python C api functions directly.
+ .. versionchanged:: 3.12
+
+ The *name* parameter can now be a :term:`path-like object`.
+
All these classes can be instantiated by calling them with at least one
argument, the pathname of the shared library. If you have an existing handle to
an already loaded shared library, it can be passed as the ``handle`` named
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
index 2e9d4c5e723..95353bab26c 100644
--- a/Lib/ctypes/__init__.py
+++ b/Lib/ctypes/__init__.py
@@ -344,6 +344,8 @@ class CDLL(object):
use_errno=False,
use_last_error=False,
winmode=None):
+ if name:
+ name = _os.fspath(name)
self._name = name
flags = self._func_flags_
if use_errno:
diff --git a/Lib/test/test_ctypes/test_loading.py b/Lib/test/test_ctypes/test_loading.py
index 15e365ed267..f2434926a51 100644
--- a/Lib/test/test_ctypes/test_loading.py
+++ b/Lib/test/test_ctypes/test_loading.py
@@ -28,10 +28,20 @@ class LoaderTest(unittest.TestCase):
unknowndll = "xxrandomnamexx"
def test_load(self):
- if libc_name is None:
- self.skipTest('could not find libc')
- CDLL(libc_name)
- CDLL(os.path.basename(libc_name))
+ if libc_name is not None:
+ test_lib = libc_name
+ else:
+ if os.name == "nt":
+ import _ctypes_test
+ test_lib = _ctypes_test.__file__
+ else:
+ self.skipTest('could not find library to load')
+ CDLL(test_lib)
+ CDLL(os.path.basename(test_lib))
+ class CTypesTestPathLikeCls:
+ def __fspath__(self):
+ return test_lib
+ CDLL(CTypesTestPathLikeCls())
self.assertRaises(OSError, CDLL, self.unknowndll)
def test_load_version(self):
diff --git a/Misc/ACKS b/Misc/ACKS
index 74abcebe21e..d27d60f5b36 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -754,6 +754,7 @@ Tim Hochberg
Benjamin Hodgson
Joerg-Cyril Hoehle
Douwe Hoekstra
+Robert Hoelzl
Gregor Hoffleit
Chris Hoffman
Tim Hoffmann
diff --git a/Misc/NEWS.d/next/Library/2018-05-21-17-18-00.gh-issue-77772.Fhg84L.rst b/Misc/NEWS.d/next/Library/2018-05-21-17-18-00.gh-issue-77772.Fhg84L.rst
new file mode 100644
index 00000000000..3a7c6d45297
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-05-21-17-18-00.gh-issue-77772.Fhg84L.rst
@@ -0,0 +1,3 @@
+:class:`ctypes.CDLL`, :class:`ctypes.OleDLL`, :class:`ctypes.WinDLL`,
+and :class:`ctypes.PyDLL` now accept :term:`path-like objects
+<path-like object>` as their ``name`` argument. Patch by Robert Hoelzl.