c_int - ctypes python 3
¿Cómo puedo descargar una DLL usando ctypes en Python? (2)
deberías poder hacerlo desechando el objeto
mydll = ctypes.CDLL(''...'')
del mydll
mydll = ctypes.CDLL(''...'')
EDITAR: El comentario de Hop es correcto, esto desvincula el nombre, pero la recolección de basura no ocurre tan rápido, de hecho incluso dudo que incluso libere la biblioteca cargada.
Ctypes no parece proporcionar una forma limpia de liberar recursos, solo proporciona un campo _handle
para el manejador dlopen ...
De modo que la única forma que veo, de una manera realmente no limpia , es que el sistema deje de lado el identificador, pero está muy sucio, ya que además ctypes mantiene referencias internas a este identificador. Entonces la descarga toma algo de la forma:
mydll = ctypes.CDLL(''./mylib.so'')
handle = mydll._handle
del mydll
while isLoaded(''./mylib.so''):
dlclose(handle)
Está tan sucio que solo lo revisé, funciona usando:
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)
Estoy usando ctypes para cargar una DLL en Python. Esto funciona genial
Ahora nos gustaría poder volver a cargar esa DLL en tiempo de ejecución.
El enfoque directo parece ser: 1. Descargar DLL 2. Cargar DLL
Lamentablemente, no estoy seguro de cuál es la forma correcta de descargar el archivo DLL.
_ctypes.FreeLibrary está disponible, pero privado.
¿Hay alguna otra forma de descargar la DLL?
Es útil poder descargar el archivo DLL para que pueda volver a generar el archivo DLL sin tener que reiniciar la sesión si está utilizando iPython o un flujo de trabajo similar. Trabajando en Windows, solo intenté trabajar con los métodos relacionados con 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)
No sé mucho de las partes internas, así que no estoy muy seguro de lo limpio que es esto. Creo que al eliminar mydll se liberan los recursos de Python y la llamada de FreeLibrary le dice a Windows que lo libere. Había asumido que la liberación con FreeLibary primero habría producido problemas, así que guardé una copia del identificador de la biblioteca y lo liberé en el orden que se muestra en el ejemplo.
Basé este método en ctypes unload dll, que cargó explícitamente el identificador al principio . Sin embargo, la convención de carga no funciona tan limpiamente como la simple "ctypes.cdll.LoadLibrary (''test.dll'')", así que opté por el método que se muestra.