Bonjour,
J'aimerai tout simplement savoir comment importer un module dont le nom est contenu dans une string.
Merci d'avance,
ProgVal
Bonjour,
J'aimerai tout simplement savoir comment importer un module dont le nom est contenu dans une string.
Merci d'avance,
ProgVal
bonjour
la réponse ici:
http://docs.python.org/library/funct...tml#__import__
Parfait, l'appel à __import__("name") me convient
et pour reload(), comment, fait-on ?
qu'est ce qui te fait croire que tu as besoin d'un reload ?
je me permets de poser la question car tu as taggé ton message [Débutant] et que j'avais exactement le même besoin quand je débutais d'utiliser reload... sauf qu'en fait j'en avais besoin parce que la philosophie des modules et de leur import m'échappait en grande partie.
je fais maintenant du python depuis 4 ans de manière plutôt intensive, j'ai parfois utilisé reload de manière temporaire dans un projet mais je ne l'ai jamais gardé.
de même, je n'ai utilisé et conservé qu'une seule fois l'approche avec __import__ (ça me permet de gérer des pluggins).
peux tu préciser le contexte ?
C'est du scripting pour XChat.
Et lorsque je met à jour un module, je n'ai que deux solutions pour l'appliquer : redémarrer XChat, ou faire un reload (voire unimport + import, mais je suis pas sûr que ça existe...)
Dans ce cas, un reload est parfaitement justifié.
Une autre question à se poser est de savoir si une mise à jour de module s'impose et s'il n'est pas possible de faire autrement.
A titre personnel, je pense éventuellement utiliser les "imports dynamiques" pour un système de plug-in.
ok, modifier le code source en modifiant des fonctions ou en ajoutant de nouvelles ?
je verai plus ça avec une approche pluggin aussi. exemple:
soit un module de ta lib qui définit une fonction func et que tu importes de cette façon:
on peut imaginer qu'un second module pluggin redéfinisse cette méthode et qu'elle s'appelle myfunc, on peut imaginer avoir quelque chose comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 from lib import func
qu'en penses tu ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 from lib import func try: pluggin = __import__("le_module_avec_ton_pluggin") from pluggin import myfunc as func except ImportError: pass
intéressant comme sujet je trouve la gestion "propre" des pluggins, je suis sûr qu'il y a des gens qui ont touché à ça ici.
J'ai du mal à comprendre comment fonctionne ce dernier code...
Tu pourrais m'expliquer ?![]()
oui bien sûr, je commente un peu:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #importe la fonction "func" du module lib. from lib import func #essaie d'importer le module du nom "le_module_avec_ton_pluggin" # et si ça marche on importe la fonction qui s'appelle "myfunc" de ce module et on lui donne le nom "func" (pour remplacer la function "func" déjà importée) try: pluggin = __import__("le_module_avec_ton_pluggin") from pluggin import myfunc as func except ImportError: #si ça n'a pas marché, on ne fait rien pass
Je vais essayer.
Merci !
EDIT : J'ai écris le script de cette façon :Mais ça me donne cette erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class Loader: def reload(self, moduleName): module = __import__(moduleName) import module as funcTraceback (most recent call last):
File "/home/progval/.xchat2/AutoLoad.py", line 30, in reload
import module as func
ImportError: No module named module
EDIT : de plus, ce script ne me convient pas, car je veux pouvoir gérer ainsi plusieurs modules simultanément, ce qui pose problème si on utilise le même alias pour tous...
voici une proposition que je peux faire.
le script principal est "main.py". les pluggins sont rangés dans le répertoire "pluggins" et il y a un fichier 'pluggins.cfg' pour les configurer.
tu peux t'amuser en changeant la valeur de "active" dans le fichier.
voici le module que j'utilise pour les fichiers de config:
http://pypi.python.org/pypi/config/0.3.7
c'est brut de décoffrage tout ça, mais ça a l'air de marcher. il y a sans doute beaucoup plus propre![]()
Merci, mais ça ne correspond pas à ce que je cherche, puisqu'on ne peut pas recharger un module.
J'aimerai savoir... y a-t-il moyen de mettre du code dans une chaîne de caractères, et l'exécuter (comme ça, je fais string="reload(%s)" % (moduleName) et ça résout tout) ?
on fait un reload sur un objet module uniquement déjà importé.
pour importer un module avec un nom donné, on utilise __import__ qui renvoit un objet module.
il suffit de faire un reload de l'objet module ainsi importé.
ça ne peut pas marcher
reload prend un objet module en argument, même si tu fais un:
ça ne fonctionnera pas si le module n'est pas chargé. et s'il est chargé, et bien tu as l'objet module donc tu peux directement faire le reload.
Code : Sélectionner tout - Visualiser dans une fenêtre à part eval("reload(%s)" % nom_du_module)
Tu as dû mal comprendre mon besoin, car ton code correspond exactement à ce que je recherchais :p
c'est fort possible, mais bon, si tu as ce qu'il faut tant mieuxTu as dû mal comprendre mon besoin, car ton code correspond exactement à ce que je recherchais :p![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager