IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Débutant]Importer un module dont le nom est dans une chaîne


Sujet :

Python

  1. #1
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut [Débutant]Importer un module dont le nom est dans une chaîne
    Bonjour,

    J'aimerai tout simplement savoir comment importer un module dont le nom est contenu dans une string.

    Merci d'avance,
    ProgVal

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970

  3. #3
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Parfait, l'appel à __import__("name") me convient


    et pour reload(), comment, fait-on ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    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 ?

  5. #5
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    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...)

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Citation Envoyé par ProgVal Voir le message
    Et lorsque je mets à jour un module
    peux tu détailler stp ? que signifie pour toi mettre à jour le module ?

  7. #7
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Modifier le code-source.

  8. #8
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Dans ce cas, un reload est parfaitement justifié.

  9. #9
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    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.

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from lib import func
    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
    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
    qu'en penses tu ?

    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.

  11. #11
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    J'ai du mal à comprendre comment fonctionne ce dernier code...

    Tu pourrais m'expliquer ?

  12. #12
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    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

  13. #13
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Je vais essayer.

    Merci !


    EDIT : J'ai écris le script de cette façon :
    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 func
    Mais ça me donne cette erreur :
    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...

  14. #14
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    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
    Fichiers attachés Fichiers attachés

  15. #15
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    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) ?

  16. #16
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    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é.

  17. #17
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Citation Envoyé par kango Voir le message
    il suffit de faire un reload de l'objet module ainsi importé.
    Mais si je n'ai pas l'objet, mais uniquement son nom, dans une chaîne de caractères ?

  18. #18
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    ça ne peut pas marcher

    reload prend un objet module en argument, même si tu fais un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval("reload(%s)" % nom_du_module)
    ç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.

  19. #19
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Tu as dû mal comprendre mon besoin, car ton code correspond exactement à ce que je recherchais :p

  20. #20
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/02/2007, 09h41
  2. Accéder à une table dont le nom est dans une table
    Par claralavraie dans le forum Oracle
    Réponses: 7
    Dernier message: 26/12/2006, 15h51
  3. Réponses: 3
    Dernier message: 05/10/2006, 18h52
  4. Réponses: 4
    Dernier message: 18/08/2006, 07h57
  5. Appel de methode dont le nom est dans une variable
    Par osopardo dans le forum Langage
    Réponses: 1
    Dernier message: 24/11/2005, 20h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo