我怎样才能卸载使用ctypes的Python中的DLL?
题
我使用ctypes的加载在Python的DLL。这个伟大的工程。
现在我们希望能够重新加载DLL在运行时。
在直接的方法似乎是: 1.卸载DLL 2.装入DLL
不幸的是我不知道卸载DLL正确的方法是什么。
_ctypes.FreeLibrary是可用的,但公开的。
有一些其他的方式来卸载DLL?
解决方案
你应该能够做到这一点通过设置对象
mydll = ctypes.CDLL('...')
del mydll
mydll = ctypes.CDLL('...')
编辑:跳的评论是正确的,这解除绑定的名称,但是垃圾收集不会发生迅速,事实上,我甚至怀疑它甚至释放加载库。
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)
其他提示
这是非常有意义的,能够卸载DLL,这样就可以重建DLL,而不必如果您使用IPython的或类似的工作流程重新启动会话。在窗口工作,我只试图与Windows DLL相关的方法来工作。
REBUILD = True
if REBUILD:
from subprocess import call
call('g++ -c -DBUILDING_EXAMPLE_DLL test.cpp')
call('g++ -shared -o test.dll test.o -Wl,--out-implib,test.a')
import ctypes
import numpy
# Simplest way to load the DLL
mydll = ctypes.cdll.LoadLibrary('test.dll')
# Call a function in the DLL
print mydll.test(10)
# Unload the DLL so that it can be rebuilt
libHandle = mydll._handle
del mydll
ctypes.windll.kernel32.FreeLibrary(libHandle)
我不知道多少内部的,所以我真的不知道怎么干净,这是。我认为,删除MYDLL释放的Python资源和FreeLibrary则调用告诉窗口释放它。我曾假定与FreeLibary释放第一将产生问题,所以我保存库手柄的副本,并在实施例中所示的顺序被释放它。
我根据本方法在 ctypes的卸载这显式加载手柄前面的dll 。装载惯例但是不作为单纯的“ctypes.cdll.LoadLibrary(‘Test.dll的’)”作为干净地工作,所以我选择出的方法
如果你需要这个功能,你可以写2名的dll从dll_B其中dll_A负载/库地卸载。使用dll_A作为为Python接口装载机和直通在dll_B功能。