je souhaite charger un module python qui est sous forme
librairie dynamique (.so sous linux ou .pyd sous win).
Cette librairie est "reçue" sous forme de chaîne de caractère.
Je peux donc la charger dans l'interprêteur de la manière
suivante en utilisant le module "imp" :
import imp
f = open('my_module.so', 'wb')
f.write(la_chaine)
f.close()
mod = imp.load_dynamic('my_module','./my_module.so')
Mais je souhaite éviter d'écrire sur le disque (pour des raisons
de sécurité). On pourrait éventuellement passer par une cStringIO
de la manière suivante :
from cStringIO import StringIO
fid = StringIO(la_chaine)
mod = imp.load_dynamic('my_module',fid)
cette solution ne marche pas car load_dynamic ne prend qu'un nom
de fichier en argument et non un fid.
Connaissez-vous un autre moyen (autre que "imp") pour charger une
librairie dynamique (sans créer le fichier) ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Alain BARTHE
Olivier Ravard a écrit :
Bonjour,
je souhaite charger un module python qui est sous forme librairie dynamique (.so sous linux ou .pyd sous win). Cette librairie est "reçue" sous forme de chaîne de caractère. Je peux donc la charger dans l'interprêteur de la manière suivante en utilisant le module "imp" :
import imp f = open('my_module.so', 'wb') f.write(la_chaine) f.close() mod = imp.load_dynamic('my_module','./my_module.so')
Mais je souhaite éviter d'écrire sur le disque (pour des raisons de sécurité). On pourrait éventuellement passer par une cStringIO de la manière suivante :
from cStringIO import StringIO fid = StringIO(la_chaine) mod = imp.load_dynamic('my_module',fid)
cette solution ne marche pas car load_dynamic ne prend qu'un nom de fichier en argument et non un fid.
Connaissez-vous un autre moyen (autre que "imp") pour charger une librairie dynamique (sans créer le fichier) ?
merci de vos suggestions ...
Olivier
Sous Linux au moins, çà *me* semble peut probable de pouvoir charger un .so sans passer par un fichier.
Je pense que la méthode imp.load_dynamic doit utiliser par derrière la fonction dlopen() (man -3C dlopen) qui travaille elle aussi sur un fichier disque.
Tu peux regarder également le module python ctypes (à partir de python 2.6) qui permet de charger des librairies dynamiques, mais je pense que tu auras le même problème.
Olivier Ravard a écrit :
Bonjour,
je souhaite charger un module python qui est sous forme
librairie dynamique (.so sous linux ou .pyd sous win).
Cette librairie est "reçue" sous forme de chaîne de caractère.
Je peux donc la charger dans l'interprêteur de la manière
suivante en utilisant le module "imp" :
import imp
f = open('my_module.so', 'wb')
f.write(la_chaine)
f.close()
mod = imp.load_dynamic('my_module','./my_module.so')
Mais je souhaite éviter d'écrire sur le disque (pour des raisons
de sécurité). On pourrait éventuellement passer par une cStringIO
de la manière suivante :
from cStringIO import StringIO
fid = StringIO(la_chaine)
mod = imp.load_dynamic('my_module',fid)
cette solution ne marche pas car load_dynamic ne prend qu'un nom
de fichier en argument et non un fid.
Connaissez-vous un autre moyen (autre que "imp") pour charger une
librairie dynamique (sans créer le fichier) ?
merci de vos suggestions ...
Olivier
Sous Linux au moins, çà *me* semble peut probable de pouvoir charger un
.so sans passer par un fichier.
Je pense que la méthode imp.load_dynamic doit utiliser par derrière la
fonction dlopen() (man -3C dlopen) qui travaille elle aussi sur un
fichier disque.
Tu peux regarder également le module python ctypes (à partir de python
2.6) qui permet de charger des librairies dynamiques, mais je pense que
tu auras le même problème.
je souhaite charger un module python qui est sous forme librairie dynamique (.so sous linux ou .pyd sous win). Cette librairie est "reçue" sous forme de chaîne de caractère. Je peux donc la charger dans l'interprêteur de la manière suivante en utilisant le module "imp" :
import imp f = open('my_module.so', 'wb') f.write(la_chaine) f.close() mod = imp.load_dynamic('my_module','./my_module.so')
Mais je souhaite éviter d'écrire sur le disque (pour des raisons de sécurité). On pourrait éventuellement passer par une cStringIO de la manière suivante :
from cStringIO import StringIO fid = StringIO(la_chaine) mod = imp.load_dynamic('my_module',fid)
cette solution ne marche pas car load_dynamic ne prend qu'un nom de fichier en argument et non un fid.
Connaissez-vous un autre moyen (autre que "imp") pour charger une librairie dynamique (sans créer le fichier) ?
merci de vos suggestions ...
Olivier
Sous Linux au moins, çà *me* semble peut probable de pouvoir charger un .so sans passer par un fichier.
Je pense que la méthode imp.load_dynamic doit utiliser par derrière la fonction dlopen() (man -3C dlopen) qui travaille elle aussi sur un fichier disque.
Tu peux regarder également le module python ctypes (à partir de python 2.6) qui permet de charger des librairies dynamiques, mais je pense que tu auras le même problème.
Olivier Ravard
Alain BARTHE a écrit :
Je pense que la méthode imp.load_dynamic doit utiliser par derrière la fonction dlopen() (man -3C dlopen) qui travaille elle aussi sur un fichier disque.
effectivement.
Tu peux regarder également le module python ctypes (à partir de python 2.6) qui permet de charger des librairies dynamiques, mais je pense que tu auras le même problème.
J'ai regardé ce module, mais on retrouve effectivement la même contrainte. Merci de ta réponse.
Olivier
Alain BARTHE a écrit :
Je pense que la méthode imp.load_dynamic doit utiliser par derrière la
fonction dlopen() (man -3C dlopen) qui travaille elle aussi sur un
fichier disque.
effectivement.
Tu peux regarder également le module python ctypes (à partir de python
2.6) qui permet de charger des librairies dynamiques, mais je pense que
tu auras le même problème.
J'ai regardé ce module, mais on retrouve effectivement la même contrainte.
Merci de ta réponse.
Je pense que la méthode imp.load_dynamic doit utiliser par derrière la fonction dlopen() (man -3C dlopen) qui travaille elle aussi sur un fichier disque.
effectivement.
Tu peux regarder également le module python ctypes (à partir de python 2.6) qui permet de charger des librairies dynamiques, mais je pense que tu auras le même problème.
J'ai regardé ce module, mais on retrouve effectivement la même contrainte. Merci de ta réponse.
Olivier
Michel Claveau - MVP
Bonsoir !
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
Sinon, est-ce que passer par un petit RAMdisk ne conviendrait pas ?
@-salutations -- Michel Claveau
Bonsoir !
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
Sinon, est-ce que passer par un petit RAMdisk ne conviendrait pas ?
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
Sinon, est-ce que passer par un petit RAMdisk ne conviendrait pas ?
@-salutations -- Michel Claveau
Olivier Ravard
Michel Claveau - MVP a écrit :
Bonsoir !
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
Sinon, est-ce que passer par un petit RAMdisk ne conviendrait pas ?
oui, ça conviendrait. Y-a-t-il un moyen de faire et monter un ramdisk directement depuis python sans intervention de l'utilsateur (au démarrage du soft par exemple) ? merci.
@-salutations
Michel Claveau - MVP a écrit :
Bonsoir !
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
Sinon, est-ce que passer par un petit RAMdisk ne conviendrait pas ?
oui, ça conviendrait. Y-a-t-il un moyen de faire et monter un ramdisk directement depuis
python sans intervention de l'utilsateur (au démarrage du soft par exemple) ?
merci.
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
Sinon, est-ce que passer par un petit RAMdisk ne conviendrait pas ?
oui, ça conviendrait. Y-a-t-il un moyen de faire et monter un ramdisk directement depuis python sans intervention de l'utilsateur (au démarrage du soft par exemple) ? merci.
@-salutations
debug this fifo
Alain BARTHE wrote:
cette solution ne marche pas car load_dynamic ne prend qu'un nom de fichier en argument et non un fid.
Sous Linux au moins, çà *me* semble peut probable de pouvoir charger un .so sans passer par un fichier.
Oui, parce que le dlopen, en fait, fait plutot un "mmap" du fichier dans des pages memoires.
Alain BARTHE wrote:
cette solution ne marche pas car load_dynamic ne prend qu'un nom
de fichier en argument et non un fid.
Sous Linux au moins, çà *me* semble peut probable de pouvoir charger un
.so sans passer par un fichier.
Oui, parce que le dlopen, en fait, fait plutot un "mmap" du
fichier dans des pages memoires.
cette solution ne marche pas car load_dynamic ne prend qu'un nom de fichier en argument et non un fid.
Sous Linux au moins, çà *me* semble peut probable de pouvoir charger un .so sans passer par un fichier.
Oui, parce que le dlopen, en fait, fait plutot un "mmap" du fichier dans des pages memoires.
Amaury Forgeot d'Arc
Michel Claveau - MVP a écrit :
Bonsoir !
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
C'est possible: py2exe le fait, puisqu'il sait charger des .pyd et des .dll à partir d'un .zip, sans passer par le disque. En fait, il émule la fonction LoadLibrary.
La méthode est là http://www.joachim-bauch.de/tutorials/load_dll_memory.html mais bien sûr, c'est du C (et beaucoup) qu'il devrait être possible de réimplémenter en utilisant ctypes. Bon courage.
-- Amaury
Michel Claveau - MVP a écrit :
Bonsoir !
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
C'est possible: py2exe le fait, puisqu'il sait charger des .pyd et des
.dll à partir d'un .zip, sans passer par le disque.
En fait, il émule la fonction LoadLibrary.
La méthode est là
http://www.joachim-bauch.de/tutorials/load_dll_memory.html
mais bien sûr, c'est du C (et beaucoup) qu'il devrait être possible de
réimplémenter en utilisant ctypes.
Bon courage.
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
C'est possible: py2exe le fait, puisqu'il sait charger des .pyd et des .dll à partir d'un .zip, sans passer par le disque. En fait, il émule la fonction LoadLibrary.
La méthode est là http://www.joachim-bauch.de/tutorials/load_dll_memory.html mais bien sûr, c'est du C (et beaucoup) qu'il devrait être possible de réimplémenter en utilisant ctypes. Bon courage.
-- Amaury
Olivier Ravard
Amaury Forgeot d'Arc a écrit :
Michel Claveau - MVP a écrit :
Bonsoir ! Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
C'est possible: py2exe le fait, puisqu'il sait charger des .pyd et des .dll à partir d'un .zip, sans passer par le disque. En fait, il émule la fonction LoadLibrary.
La méthode est là http://www.joachim-bauch.de/tutorials/load_dll_memory.html mais bien sûr, c'est du C (et beaucoup) qu'il devrait être possible de réimplémenter en utilisant ctypes. Bon courage.
Je vais regarder de ce côté là. Merci.
Olivier
Amaury Forgeot d'Arc a écrit :
Michel Claveau - MVP a écrit :
Bonsoir !
Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le
seule méthode qui me vient à l'esprit, c'est de pratiquer de
l'injection de DLL. Malheureusement (ou heureusement ?) cela est
systématiquement identifié comme une atteinte de sécurité, avec
blocage aussi bien par l'OS que par les antivirus, ou autres éléments
(dits) protecteurs.
C'est possible: py2exe le fait, puisqu'il sait charger des .pyd et des
.dll à partir d'un .zip, sans passer par le disque.
En fait, il émule la fonction LoadLibrary.
La méthode est là
http://www.joachim-bauch.de/tutorials/load_dll_memory.html
mais bien sûr, c'est du C (et beaucoup) qu'il devrait être possible de
réimplémenter en utilisant ctypes.
Bon courage.
Bonsoir ! Avec Windows, pour charger une DLL "en mémoire" (sans fichier), le seule méthode qui me vient à l'esprit, c'est de pratiquer de l'injection de DLL. Malheureusement (ou heureusement ?) cela est systématiquement identifié comme une atteinte de sécurité, avec blocage aussi bien par l'OS que par les antivirus, ou autres éléments (dits) protecteurs.
C'est possible: py2exe le fait, puisqu'il sait charger des .pyd et des .dll à partir d'un .zip, sans passer par le disque. En fait, il émule la fonction LoadLibrary.
La méthode est là http://www.joachim-bauch.de/tutorials/load_dll_memory.html mais bien sûr, c'est du C (et beaucoup) qu'il devrait être possible de réimplémenter en utilisant ctypes. Bon courage.