Comment puis-je retirer une DLL à l'aide de ctypes en Python?
Je suis en utilisant ctypes de charger une DLL en Python. Cela fonctionne très bien.
Maintenant nous aimerions être en mesure de recharger cette DLL lors de l'exécution.
À la simplicité de la démarche semble être:
1. Décharger les DLL
2. Charger la DLL
Malheureusement, je ne suis pas sûr de ce que la bonne façon de décharger la DLL est.
_ctypes.FreeLibrary est disponible, mais en privé.
Est-il un autre moyen de décharger les DLL?
Avez-vous trouver une meilleure réponse que mon laid? Si non, peut-être, vous devriez demander sur leur liste d'envoi, et si il n'est pas présent rapport de bug, il. 'del' doit appeler la fonction pour sortir ressources!
OriginalL'auteur Tom Hennen | 2008-12-11
Vous devez vous connecter pour publier un commentaire.
vous devriez être en mesure de le faire par l'élimination de l'objet
EDIT: Hop commentaire est juste, cela se délie le nom, mais la collecte des ordures ne se produit pas rapidement, en fait, j'en doute même même les communiqués de la bibliothèque chargée.
Ctypes ne semble pas fournir un moyen propre à libérer des ressources, il ne fait que fournir un
_handle
domaine de la dlopen poignée...De sorte que la seule façon dont je le vois, vraiment, vraiment propre, est le système dépendante dlclose la poignée, mais il est très très sale, comme l'avait d'ailleurs ctypes conserve en interne, les références à cette poignée. Si le déchargement prend quelque chose de la forme:
C'est tellement impur, je n'ai vérifié qu'il fonctionne à l'aide de:
Lorsque la bibliothèque partagée ne peut pas être refcount décrémenté, POSIX
dlclose
renvoie zéro et WindowsFreeLibrary
renvoie zéro._ctypes.dlclose
et_ctypes.FreeLibrary
(notez le trait de soulignement) leverOSError
dans ce cas.Pour les personnes qui cherchent à trouver un moyen de le faire sur Windows, reportez-vous à stackoverflow.com/questions/19547084/...
OriginalL'auteur Piotr Lesnicki
Il est utile d'être en mesure de décharger la DLL sorte que vous pouvez reconstruire la DLL sans avoir à redémarrer la session si vous utilisez iPython ou similaire flux de travail. De travail dans windows, j'ai seulement tenté de travailler avec les DLL de windows méthodes connexes.
Je ne connais pas beaucoup de l'intérieur donc je ne suis pas vraiment sûr de savoir comment nettoyer c'est. Je pense que la suppression de madll libère le Python des ressources et de la FreeLibrary appel indique à windows gratuit. J'avais supposé que libération avec FreeLibary premier aurait engendré des problèmes donc j'ai sauvé une copie de la bibliothèque de la poignée et libéré dans l'ordre indiqué dans l'exemple.
J'ai basé cette méthode sur ctypes décharger les dll qui a chargé le gérer explicitement à l'avant. Le chargement de la convention, cependant, ne fonctionne pas aussi proprement que le simple "ctypes.cdll.LoadLibrary('test.dll')" j'ai donc opté pour la méthode indiquée.
int
valeurs; qui tronque la valeur d'un 64-bit pointeur. Vous devez envelopper la poignée comme un pointeur, c'est à directypes.c_void_p(mydll._handle)
, ou de déclarerkernel32.FreeLibrary.argtypes = (ctypes.c_void_p,)
, ou plutôt appeler_ctypes.FreeLibrary
(note la première souligner, c'est le sous-jacent_ctypes
module d'extension).OriginalL'auteur pyHazard
Si vous avez besoin de cette fonctionnalité, vous pouvez écrire 2 dll, où dll_A charge/Décharge de la bibliothèque de dll_B. Utilisation dll_A comme python interface de chargement et de relais pour les fonctions en dll_B.
OriginalL'auteur chris