Python ctypes.CDLL()和ctypes.CDLL.LoadLibrary()之间有什么区别?

Python ctypes.CDLL()和ctypes.CDLL.LoadLibrary()之间有什么区别?,python,ctypes,Python,Ctypes,这两种方法似乎都有效(对我来说),但CDLL()方法似乎返回了一个具有\u handle属性的对象,该属性可用于通过ctypes.windell.kernel32.freellibrary()卸载库(至少在Windows上-我还不知道如何在Linux上这样做) 这两种方法有什么区别?为什么我会选择其中一种 最终,我的目标是能够在Linux上的两个Windows上加载和卸载库(因为我有一个第三方库,有时似乎会进入损坏状态-我希望卸载/重新加载会重置它)。中对所有内容都有很好的解释: 类ctypes

这两种方法似乎都有效(对我来说),但
CDLL()
方法似乎返回了一个具有
\u handle
属性的对象,该属性可用于通过
ctypes.windell.kernel32.freellibrary()
卸载库(至少在Windows上-我还不知道如何在Linux上这样做)

这两种方法有什么区别?为什么我会选择其中一种


最终,我的目标是能够在Linux上的两个Windows上加载和卸载库(因为我有一个第三方库,有时似乎会进入损坏状态-我希望卸载/重新加载会重置它)。

中对所有内容都有很好的解释:

类ctypes.CDLL(名称、模式=默认模式、句柄=无、使用错误号=假、使用上次错误号=假、winmode=0)
此类的实例表示加载的共享库。这些库中的函数使用标准的C调用约定,并假定返回int

类别C类型。库装载机(dlltype)

加载库(名称)
将共享库加载到进程中并返回它。此方法始终返回库的新实例

这些预制图书馆加载器可提供:

ctypes.cdll
创建实例

因此,第二种形式只是一种方便的包装,它们之间绝对没有功能上的区别,如下所示:

>将ctypes作为ct导入
>>>
>>>
>>>k32_1=ct.CDLL(“kernel32.dll”)#1。
>>>k32_2=ct.cdll.LoadLibrary(“kernel32.dll”)#2.1。
>>>k32#3=ct.cdll.kernel32#2.2。
>>>
>>>k32_1,k32_2,k32_3
(, )
>>>类型(k32_1)、类型(k32)、类型(k32_3)
(, )
>>>
>>>k32_1._handle==k32._handle==k32_3._handle
真的
用最适合你的东西<第二种形式(#2.2.)较短(我想这就是它的目的)
#1。和#2.1。相同(#2.1.可能更具解释性(因为它有LoadLibrary)),它们允许您从自定义路径加载库,或使用不同于默认值的扩展名加载库。就个人而言#1。是我喜欢的那个

有关更多详细信息,您可以看一看,尤其是实现中的LibraryLoader(cdll实际上是,并且)很容易理解


只是提醒一下(可能你已经知道你在做什么):加载和卸载库有时会很棘手。

可能我在这里有点困惑,但我问的是cdll.LoadLibrary(),你的回答中没有提到这一点。您的'ct.cdll.kernel32'示例不涉及加载外部库(我认为它假定已加载)。我确实读过那一页,但还是很困惑。我的错,我错过了LoadLibrary。是一样的。库是否已加载并不相关。无论如何,更简单的表单调用LoadLibrary。