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 :

import dynamique d'un script externe


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 67
    Par défaut import dynamique d'un script externe
    Salutation !

    Alors voila mon problème est simple, j'aimerai créer dynamiquement une instance d' une classe dont je connais seulement le nom.
    Dans mon système, chaque classe est décrite dans un script python portant le même nom.

    au niveau du code qui pose problème, la variable a contient le nom de la classe que j'aimerai instancé, et par extension, le nom du module à importer ( classe et module ayant le même nom.
    En essayant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      #pose problème
      a=__import__(a+"."+a)
     
    self.currentAction = eval('%s()' % a)
    L'import renvoit une erreur : No module named WalkTo

    En essayant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
      a=__import__(a)
     
      #pose problème
      self.currentAction = eval('%s()' % a)
    L'eval renvoit une erreur : WalkTo Name not found

    Si maintenant je remplace a=__import__(a) par from WalkTo import WalkTo
    ( autrement dit, un import non dynamique , tout marche impécablement ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from WalkTo import WalkTo
      self.currentAction = eval('%s()' % a)    
    #tout baigne
    Qu'est ce qui cloque dans mes veines tentative d'importation ?

    Merci !

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = __import__(a + "." + a)
    Revient à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import WalkTo.WalkTo as a
    Ce qui est illégal (on ne peut importer que des modules, pas des instances/objets/… dans un module).

    Revient à
    a contient donc le module WalkTo, et non la classe WalkTo…

    Le plus simple est probablement de la récupérer avec getattr(), quelque chose comme ça*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = __import__(a).getattr(a, None)
    Avec None en second paramètre, tu peux tester a, s’il n’est pas None, c’est qu’il est valide… Et en plus, tu devrais pouvoir te passer de cet hideux eval()*!

    Au final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a_class = __import__(a_name).getattr(a_name, None)
    if a_class is not None:
        self.currentAction = a_class()

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 67
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Au final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a_class = __import__(a_name).getattr(a_name, None)
    if a_class is not None:
        self.currentAction = a_class()
    Merci pour votre réponse.

    Je comprend mes erreurs et votre suggestion.
    Cependant, votre solution n'est pas correcte, et renvoit cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'module' object has no attribute 'getattr'
    En cherchant dans les spécifications de la classe Module, (ici), je ne trouve aucune fonction capable de me retourner la classe que j'aimerai tant pouvoir accéder.

    Une petite idée ?

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 67
    Par défaut
    Voila après quelques recherches et tentatives, J'ai trouvé la bonne formulation,
    Je la poste au cas où quelqu'un est interessé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          #call dynamically the script containig the action
                a_mod  = __import__(a_name)
                a_class =getattr(a_mod, a_name)
                if a_class is None:
                    raise ImportError("can't import dynamically the action"+a_name)
     
     
                self.currentAction=a_class()
    Merci en tout cas pour m'avoir mis sur la voie

  5. #5
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Oulàlà… J’étais un peu fatigué hier soir, mais quand même… Désolé*!

    getattr n’est en effet pas un membre d’aucun module, mais une fonction builtin… Une corde, vite, que j’aille me pendre*!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/06/2006, 09h47
  2. importer base mysql et script php...
    Par kenken38 dans le forum Administration
    Réponses: 8
    Dernier message: 04/05/2006, 17h03
  3. Script externe ?
    Par angelevil dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/03/2006, 22h31
  4. Créer un menu dynamique (appele de pages externe)
    Par pierrot10 dans le forum ASP
    Réponses: 2
    Dernier message: 28/11/2005, 08h35
  5. [MySQL] Envoi d'informations vers un script externe...
    Par tom06440 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 07/10/2005, 18h00

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