我使用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功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top