Bonjour,
J'aimerai tout simplement savoir comment importer un module dont le nom est contenu dans une string.
Merci d'avance,
ProgVal
Version imprimable
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...)
Modifier le code-source.
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:
1
2 from lib import func
qu'en penses tu ?Code:
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 ? :oops:
oui bien sûr, je commente un peu:
Code:
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:
1
2
3
4 class Loader: def reload(self, moduleName): module = __import__(moduleName) import module as func
Citation:
Traceback (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: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 mieux :PCitation:
Tu as dû mal comprendre mon besoin, car ton code correspond exactement à ce que je recherchais :p