您应该能够通过放置对象来做到这一点
mydll = ctypes.CDLL('...')
del mydll
mydll = ctypes.CDLL('...')
霍普的评论是正确的,这取消了名称的绑定,但是垃圾回收不会很快发生,实际上,我什至怀疑它是否会释放已加载的库。
Ctypes似乎没有提供一种干净的方式来释放资源,它仅提供了_handle
dlopen句柄的字段…
因此,我所看到的唯一,真正, 是,系统地依赖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)