bpo-33591: Add support for path like objects to `ctypes.CDLL` (#7032)

Co-authored-by: Oleg Iarygin <oleg@arhadthedev.net>
This commit is contained in:
mrh1997 2023-02-05 18:36:57 +01:00 committed by GitHub
parent 90d85a9b41
commit f7e9fbacb2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 4 deletions

View File

@ -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

View File

@ -344,6 +344,8 @@ def __init__(self, name, mode=DEFAULT_MODE, handle=None,
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:

View File

@ -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):

View File

@ -754,6 +754,7 @@ Tim Hochberg
Benjamin Hodgson
Joerg-Cyril Hoehle
Douwe Hoekstra
Robert Hoelzl
Gregor Hoffleit
Chris Hoffman
Tim Hoffmann

View File

@ -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.