Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

module ctypes

6 réponses
Avatar
Jacques Picard
Bonjour à tous,

J'utilise ctypes pour activer une dll écrite en C qui effectue des
calculs complexes pour évaluer la déclinaison magnétique en fonction de
la latitude et de la longitude.
J'ai trouvé la fonction qui charge et active la fonction exportée de ma
dll et cela fonctionne bien, MAIS je cherche la fonction de libération
de la dll !
Le chargement et l'accès à la dll se fait dans une fonction python de
cette manière :

def calldll(self, latitude, longitude):
self.declinaison = windll.geodecl.princ(latitude, longitude)

QUESTION est-ce que la dll est libérée en quittant la fonction ?

Merci de me répondre !

@+
jvpic

6 réponses

Avatar
MCI, Shadok Gouroudoudou
Bonsoir !

A priori, je pense que la DLL reste en mémoire. Ma supposition est
basée sur la pléthore d'utilitaires dont la fonction est de décharger
de la mémoire les DLL plus utilisées.

PS : je parle pour windows, bien sûr.




--
@-salutations

Michel Claveau
Avatar
Jacques Picard
Bonsoir !

A priori, je pense que la DLL reste en mémoire. Ma supposition est basée
sur la pléthore d'utilitaires dont la fonction est de décharger de la
mémoire les DLL plus utilisées.

PS : je parle pour windows, bien sûr.




Merci pour cette info !


@+

Avatar
Pierre Maurette
Bonjour à tous,

J'utilise ctypes pour activer une dll écrite en C qui effectue des calculs
complexes pour évaluer la déclinaison magnétique en fonction de la latitude
et de la longitude.
J'ai trouvé la fonction qui charge et active la fonction exportée de ma dll
et cela fonctionne bien, MAIS je cherche la fonction de libération de la dll
!
Le chargement et l'accès à la dll se fait dans une fonction python de cette
manière :

def calldll(self, latitude, longitude):
self.declinaison = windll.geodecl.princ(latitude, longitude)

QUESTION est-ce que la dll est libérée en quittant la fonction ?


Elle le sera à coup sûr à la fin du processus qui l'a chargée. Même si
Python est en intermédiaire, c'est le kernel de Windows qui s'occupe
des DLLs.
En gros, la DLL est chargée à la première demande est un compteur de
processus utilisateurs est incrémenté à chaque nouvelle demande. Ce
compteur est décrémenté soit quand un processus le demande
spécifiquement, soit quand il se ferme. Le compteur arrivé à 0,la DLL
est déchargée.
Les fonctions Windows courantes sont LoadLibrary(), GetProcAddress() et
FreeLibrary(). Vous pourriez utiliser FreeLibrary() (sans doute avec
windll.FreeLibrary(), ou peut-être windll.kernel32.FreeLibrary(). Mais
il vous faut envoyer le handle récupéré par LoadLibrary(), et vous
allez vous compliquer la vie, soit à tout faire à la main, soit à
utiliser GetModuleHandle().
Je n'ai jamais utilisé ces techniques sous Python (à priori, mais ça
peut changer, Python est mon langage "un seul code pour toutes les
plateformes"), mais je ne vois pas pourquoi il en irait pour une DLL
différemment des autres ressources, c'est à dire géré au mieux au
travers du GC. Est-ce important de savoir s'il va compter sur le cache
et utiliser LoadLibrary()/FreeLibrary() souvent, ou garder l'objet tant
que la fonction peut être appelée ? Ne pouvez-vous pas faire confiance
à Python ?
Vous pouvez voir ce qui se passe en utilisant un utilitaire quelconque,
par exemple un truc de Sysinternals (racheté par Microsoft, tiens...).
Voyez ListDLLs à cette page:
<URL:http://www.microsoft.com/technet/sysinternals/Processesandthreadsutilities.mspx?wt.svlþatured>

--
Pierre Maurette

Avatar
MCI, Shadok Gouroudoudou
Bonsoir !


Les utilitaires de sysinternals sont excellents !

Mais, dans les outils standards de windows, il y a déjà ce qu'il faut :
TASKLIST /M permet de voir les DLL chargées, et par quoi.
Cette commande dispose également d'un mini-mode de requêtage, qui
permet de mieux cibler les recherches.

Évidemment, les utilitaires de Russinovitch ont une interface graphique
nettement plus jolie. Mais TASKLIST peut être piloté par Python, car
ses
sorties passent par STDOUT.

Une autre possibilité standard de Windows, c'est d'utiliser WMI
(pilotable par Python), pour interroger directement les entrailles du
système.


Mais, en fait, la question que je me pose, c'est de savoir si c'est
vraiment important de savoir si la DLL est encore là, ou non. Quelle
est la taille occupée ? Quel impact ? Si c'est pour gagner quelques
centaines de ko, autant laisser tomber.






--
@-salutations

Michel Claveau
Avatar
Amaury Forgeot d'Arc
Bonjour à tous,

J'utilise ctypes pour activer une dll écrite en C qui effectue des
calculs complexes pour évaluer la déclinaison magnétique en fonction
de la latitude et de la longitude.
J'ai trouvé la fonction qui charge et active la fonction exportée de
ma dll et cela fonctionne bien, MAIS je cherche la fonction de
libération de la dll !
Le chargement et l'accès à la dll se fait dans une fonction python de
cette manière :

def calldll(self, latitude, longitude):
self.declinaison = windll.geodecl.princ(latitude, longitude)

QUESTION est-ce que la dll est libérée en quittant la fonction ?


Elle le sera à coup sûr à la fin du processus qui l'a chargée. Même si
Python est en intermédiaire, c'est le kernel de Windows qui s'occupe des
DLLs.
En gros, la DLL est chargée à la première demande est un compteur de
processus utilisateurs est incrémenté à chaque nouvelle demande. Ce
compteur est décrémenté soit quand un processus le demande
spécifiquement, soit quand il se ferme. Le compteur arrivé à 0,la DLL
est déchargée.
Les fonctions Windows courantes sont LoadLibrary(), GetProcAddress() et
FreeLibrary(). Vous pourriez utiliser FreeLibrary() (sans doute avec
windll.FreeLibrary(), ou peut-être windll.kernel32.FreeLibrary(). Mais
il vous faut envoyer le handle récupéré par LoadLibrary(), et vous allez
vous compliquer la vie, soit à tout faire à la main, soit à utiliser
GetModuleHandle().


Ce n'est pas si difficile:

import ctypes, _ctypes
myLib = ctypes.windll.LoadLibrary('ws2_32')
_ctypes.FreeLibrary(myLib._handle)

--
Amaury


Avatar
Jacques Picard
Bonjour à tous,

J'utilise ctypes pour activer une dll écrite en C qui effectue des
calculs complexes pour évaluer la déclinaison magnétique en fonction
de la latitude et de la longitude.
J'ai trouvé la fonction qui charge et active la fonction exportée de
ma dll et cela fonctionne bien, MAIS je cherche la fonction de
libération de la dll !
Le chargement et l'accès à la dll se fait dans une fonction python de
cette manière :

def calldll(self, latitude, longitude):
self.declinaison = windll.geodecl.princ(latitude, longitude)

QUESTION est-ce que la dll est libérée en quittant la fonction ?


Elle le sera à coup sûr à la fin du processus qui l'a chargée. Même si
Python est en intermédiaire, c'est le kernel de Windows qui s'occupe
des DLLs.
En gros, la DLL est chargée à la première demande est un compteur de
processus utilisateurs est incrémenté à chaque nouvelle demande. Ce
compteur est décrémenté soit quand un processus le demande
spécifiquement, soit quand il se ferme. Le compteur arrivé à 0,la DLL
est déchargée.
Les fonctions Windows courantes sont LoadLibrary(), GetProcAddress()
et FreeLibrary(). Vous pourriez utiliser FreeLibrary() (sans doute
avec windll.FreeLibrary(), ou peut-être windll.kernel32.FreeLibrary().
Mais il vous faut envoyer le handle récupéré par LoadLibrary(), et
vous allez vous compliquer la vie, soit à tout faire à la main, soit à
utiliser GetModuleHandle().


Ce n'est pas si difficile:

import ctypes, _ctypes
myLib = ctypes.windll.LoadLibrary('ws2_32')
_ctypes.FreeLibrary(myLib._handle)

Ok !


Je crois que l'on a là une bonne réponse.
De fait j'utilise deux dll, l'une de faible taille peut rester en
mémoire mais l'autre importante mérire d'être déchargée pour faire
"propre" d'autant qu'elle n'est utilisée qu'une fois.

Merci à tous !!!

JP