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 :

Obtenir les noms des classes et des méthodes disponible dans un fichier .py


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Obtenir les noms des classes et des méthodes disponible dans un fichier .py
    Bonjour,

    je bute sur un problème : celui d'afficher le noms des classes disponibles dans mes fichiers, ainsi que les méthodes disponibles pour ces classes.

    'A la main' je sais comment faire grâce à la commande dir(module) pour obtenir les noms des classes et des méthodes du modules et dir(classe) pour obtenir les méthodes de la classe.

    Mais je voudrais y arriver automatiquement, en lançant le script sur un répertoire donné et non en nommant précisément le fichier/module impacté.

  2. #2
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    la fonction 'exec' peut remplacer ce que tu fais à la main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def listClasses(modulename):
        exec("import %s"%modulename)
        exec ("module = %s"%modulename)
        print modulename
        for itemname in dir(module):
            print "    %s"%itemname
     
    for modulename in ["os", "sys"]:
        listClasses(modulename)
    A+

    Pfeuh

    P.S. Méfie-toi quand même sur des modules que tu n'as pas écrit toi même, le simple fait de faire 'import toto' peut lancer du code qui n'est pas encapsulé dans une classe ou un fonction.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Makiavelik Voir le message
    'A la main' je sais comment faire grâce à la commande dir(module) pour obtenir les noms des classes et des méthodes du modules et dir(classe) pour obtenir les méthodes de la classe.
    Comme un script peut faire des "import", l'ensemble des classes qui seront listés dans le dir n'est pas réduit aux "classes" définies dans le fichier.
    Vous voulez obtenir quoi au juste?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Comme un script peut faire des "import", l'ensemble des classes qui seront listés dans le dir n'est pas réduit aux "classes" définies dans le fichier.
    Vous voulez obtenir quoi au juste?
    - W
    Effectivement, je ne voudrais idéalement que le noms des classes du fichier courant ainsi que les méthodes associées.

    Merci à pfeuh, car cela donne déjà de bons résultats

  5. #5
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Points : 149
    Points
    149
    Par défaut
    Un code un peu plus pythonesque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import inspect
     
    def listClasses(modulename):
        module = __import__(modulename)
        for name, obj in module.__dict__.items():
            if inspect.isclass(obj):
                print "Class %s" % name
                #for item in inspect.getmembers(obj):
                #    print item
     
                for subname, subobj in obj.__dict__.items():
                    if inspect.ismethod(getattr(obj,subname)):
                        print "Methode %s" % subname
                print "--------------------------"
     
     
     
    for modulename in ["csv", "sys"]:
        print "Module : %s" % modulename
        listClasses(modulename)
        print "####################"

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    ce serait beaucoup plus simple avec inspect.getmembers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def print_classes(module_name):
        m = __import__(module_name)
        for name, defn in inspect.getmembers(m, inspect.isclass):
            print 'class: ', name
            for m_name, m_defn in inspect.getmembers(defn, inspect.ismethod):
                print '\tmethod:', m_name, m_defn
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Points : 149
    Points
    149
    Par défaut
    Ah j'ai trop survolé la doc j'avais pas vue le deuxième paramètre de getmembers

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Effectivement c'est plus python spirit et cela fonctionne tout aussi bien, merci

    Par contre, j'aurais une dernière question.

    Dans les exemples ci dessus, on part sur des librairies existantes (pas de difficulté à les trouver en faisant un import); mes fichiers à importer ne sont pas dans mon répertoire courant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /Tools
        fichier_listant_les_classes.py
    /Tests/
        /Rep1
            fic1.py
            fic2.py
        /Rep2
            etc.
    Si je le laisse dans Tools, cela ne fonctionne pas et ce même en faisant avant l'appel à la fonction :
    - os.chdir(/Tests/rep1)
    ou
    - ajout /Tests/rep1 dans la variable d'env PYTHONPATH

    Par contre :
    Si je mets le fichier python dans Rep1, cela fonctionne
    Si je place la variable d'env PYTHONPATH avant le lancement du script, cela fonctionne aussi

    j'avoue etre perdu

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    je m'auto réponds : RTFM

    il fallait utiliser la variable sys.path quand on est dans son programme python

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/03/2015, 17h08
  2. Créer une table dont les noms de colonnes sont des paramètres
    Par Mythrandil dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/09/2007, 15h08
  3. [Débutant] [interop Word] obtenir les noms des champs Fields
    Par TSalm dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 30/08/2007, 22h03
  4. Réponses: 1
    Dernier message: 14/06/2007, 21h37
  5. [VBA]Obtenir les noms des polices disponibles
    Par xp dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/03/2004, 15h39

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