windll c_int python dll ctypes

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.