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 :

Connaitre le chemin d'un module


Sujet :

Python

  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut Connaitre le chemin d'un module
    Bonjour

    je souhaite retrouver le chemin (si possible absolu) d'un fichier module à partir de heu... sa valeur: je m'explique.

    J'ai une fonction qui reçoit en paramètre une fonction :Au milieu de la fonction, j'ai besoin d'avoir le chemin du répertoire du module dans lequel est placé la fonction.

    J'obtient la valeur du module comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    func.__module__ #.path ? je ne sait pas ce qu'il faut ajouter.
    et là, je suis bloqué, il n'y a pas d'atribut .path ou .directory ....

    Merci d'avoir lu ce post (et si possible d'y répondre (enfin si vous conaissez la solution (en même temps, je doit être le seul qui ne la connait pas, ça à l'air trivial)))

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    tu as l'attribut __file__ qui donne le path du module
    pour manipuler les parties d'un nom de fichier: http://python.developpez.com/faq/?pa...ulerNomFichier
    + abspath (qui doit donner le chemin absolu)

    et os.getcwd() doit donner le répertoire courant

  3. #3
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    salut,

    tu peux utiliser le pouvoir de l'introspection pour explorer tes objets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import sys
    sys.path.append('/home/pacificator/prog/test/func/path/to/module/')
     
    import module1
    print dir(module1)
    print module1.__file__
     
    from module1 import func1
    print dir(func1)
    print func1.func_globals
    print func1.func_globals['__file__']

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Prenons un exemple.

    Création d'un module "testmod.py":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    def toto():
        pass
    Alors, dans le code qui utilise ce module, le nom du module de la fonction toto peut être donnée par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    from testmod import *
     
    print toto.__module__
    testmod
    et son chemin se trouve dans le dictionnaire sys.modules:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import sys
     
    print sys.modules[toto.__module__]
    <module 'testmod' from 'C:\Python25\Pydev\test\testmod.py'>
    Il ne reste plus qu'à extraire le chemin cherché.

    On peut donc proposer la fonction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def adrfonc(fonc):
        mod = fonc.__module__
        adr = "%s" % sys.modules[mod]
        return mod, adr.split("'")[-2]
    Avec comme argument le nom de la fonction, celle-ci retourne un tuple composé du nom du module et de son chemin

    Avec l'exemple précédent, cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    m, a = adrfonc(toto)
    print m
    testmod
    print a
    C:\Python25\Pydev\test\testmod.py
    Si on préfère, on peut obtenir le chemin seul (sans le nom du module testmod.py ou testmod.pyc) avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print os.path.dirname(a)
    C:\Python25\Pydev\test
    Mais ça ne marche que pour les fonctions qu'on fabrique soi-même. Si on fait cela pour les fonctions intégrées, la valeur retournée par le dictionnaire sys.modules ne fournit pas, et pour cause, d'adresse de module, et le découpage par split("'") ne fournira pas d'adresse correcte.

    Tyrtamos

  5. #5
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    merci à tous, la méthode qui m'intéressait étais en fait __file__et dirname, bien que celle proposée par tyrtamos soit tout aussi valable.


    par contre, je n'ai pas trouvé de méthode abspath...

    tant que j'y suis sauriez-vous comment renseigner la docstring d'un module ?



    merci

  6. #6
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    par contre, je n'ai pas trouvé de méthode abspath...

  7. #7
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Guigui_ Voir le message
    pas vu...


    bon, sinon, c'est tout résolu, merci à tous .

    sinon vous sauriez comment écrire la docstring (propriété __doc__) d'un module ?


    merci

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

Discussions similaires

  1. Connaitre le chemin d'un module depuis un autre
    Par Aure7780 dans le forum Maven
    Réponses: 2
    Dernier message: 02/05/2012, 13h35
  2. Réponses: 4
    Dernier message: 30/10/2006, 18h59
  3. [powerpoint] connaitre le chemin d'une vidéo insérée
    Par Louis-Guillaume Morand dans le forum Powerpoint
    Réponses: 4
    Dernier message: 23/10/2006, 20h16
  4. Réponses: 2
    Dernier message: 26/06/2006, 10h27
  5. [XSLT] Connaitre le chemin d'un noeud
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/03/2006, 13h48

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