gpt4 book ai didi

python - 如何在 Python 中使用 ctypes 卸载 DLL?

转载 作者:IT老高 更新时间:2023-10-28 21:02:57 25 4
gpt4 key购买 nike

我正在使用 ctypes 在 Python 中加载 DLL。这很好用。

现在我们希望能够在运行时重新加载该 DLL。

直接的方法似乎是:1.卸载DLL2.加载DLL

很遗憾,我不确定卸载 DLL 的正确方法是什么。

_ctypes.FreeLibrary 可用,但私有(private)。

还有其他方法可以卸载 DLL 吗?

最佳答案

你应该可以通过处理对象来做到这一点

mydll = ctypes.CDLL('...')
del mydll
mydll = ctypes.CDLL('...')

编辑: Hop 的评论是正确的,这解除了名称的绑定(bind),但垃圾收集并没有那么快发生,事实上我什至怀疑它是否会释放加载的库。

Ctypes 似乎没有提供一种干净的方式来释放资源,它只是为 dlopen 句柄提供了一个 _handle 字段...

所以我看到的唯一方法,真正,非常不干净的方法,是系统依赖 dlclose 句柄,但它非常非常不干净,因为 ctypes 保持对这个句柄的内部引用.所以卸载需要以下形式:

mydll = ctypes.CDLL('./mylib.so')
handle = mydll._handle
del mydll
while isLoaded('./mylib.so'):
dlclose(handle)

它太不干净了,我只检查了它是否可以使用:

def isLoaded(lib):
libp = os.path.abspath(lib)
ret = os.system("lsof -p %d | grep %s > /dev/null" % (os.getpid(), libp))
return (ret == 0)

def dlclose(handle)
libdl = ctypes.CDLL("libdl.so")
libdl.dlclose(handle)

关于python - 如何在 Python 中使用 ctypes 卸载 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/359498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com