920 votes

Comment récupérer le chemin d'accès d'un module ?

Je veux détecter si le module a changé. Maintenant, l'utilisation de inotify est simple, vous devez juste connaître le répertoire à partir duquel vous voulez obtenir des notifications.

Comment récupérer le chemin d'accès d'un module en python ?

1 votes

Vérifiez le modulefinder : docs.python.org/library/modulefinder.html

15 votes

Si vous cherchez toujours sur ce site, veuillez mettre à jour la réponse correcte à ce . Elle est bien plus propre que la solution proposée et fonctionne également dans les cas où __file__ n'est pas défini.

3 votes

@erikb85 : ce n'est pas seulement plus propre ; inspect -Cette solution fonctionne également pour execfile() le cas où __file__ produit un nom erroné en silence.

1117voto

orestis Points 3398
import a_module
print(a_module.__file__)

vous donnera en fait le chemin d'accès au fichier .pyc qui a été chargé, du moins sous Mac OS X. Donc je suppose que vous pouvez le faire :

import os
path = os.path.abspath(a_module.__file__)

Vous pouvez également essayer :

path = os.path.dirname(a_module.__file__)

Pour obtenir le répertoire du module.

58 votes

ceci répond à comment obtenir le chemin du module que vous importez, mais pas du module/script dans lequel vous vous trouvez (pour le script que vous exécutez, __file__ n'est pas un chemin complet, il est relatif). Pour le fichier dans lequel je me trouve, j'ai dû importer un autre module du même répertoire et faire comme indiqué ici. Quelqu'un connaît-il un moyen plus pratique ?

0 votes

Je ne l'ai pas essayé, mais self.__file__ donne-t-il des résultats différents de ceux de __file__ ?

5 votes

@hbdgaf à peu près sûr qu'il n'y a pas de chose telle qu'un intégré. self.__file__

326voto

SummerBreeze Points 656

Il y a inspect en python.

Documentation officielle

Le module inspect fournit plusieurs fonctions utiles pour aider à obtenir informations sur des objets vivants tels que des modules, des classes, des méthodes, les fonctions, les traces, les objets frame et les objets code. Par exemple, il peut vous aider à examiner le contenu d'une classe, à récupérer le code source source d'une méthode, extraire et formater la liste des arguments d'une fonction, ou obtenir toutes les informations dont vous avez besoin pour afficher un traceback détaillé.

Exemple :

>>> import os
>>> import inspect
>>> inspect.getfile(os)
'/usr/lib64/python2.7/os.pyc'
>>> inspect.getfile(inspect)
'/usr/lib64/python2.7/inspect.pyc'
>>> os.path.dirname(inspect.getfile(inspect))
'/usr/lib64/python2.7'

11 votes

Vous pouvez utiliser inspect pour obtenir également le nom du fichier courant ; voir stackoverflow.com/a/50905/320036

8 votes

J'ai cherché cette question sur Google plusieurs fois et ce est la réponse la plus raisonnable que j'aie jamais vue ! Veuillez mettre à jour les informations sur inspect.currentframe()

0 votes

le site inspect.getfile() ne fonctionne pas avec le module _io mais fonctionne avec le module io .

80voto

mcstrother Points 732

Comme les autres réponses l'ont dit, le meilleur moyen de le faire est avec __file__ (démontrée à nouveau ci-dessous). Cependant, il y a une mise en garde importante, à savoir que __file__ n'existe PAS si vous exécutez le module seul (c'est-à-dire en tant que __main__ ).

Par exemple, disons que vous avez deux fichiers (qui se trouvent tous deux dans votre PYTHONPATH) :

#/path1/foo.py
import bar
print(bar.__file__)

et

#/path2/bar.py
import os
print(os.getcwd())
print(__file__)

L'exécution de foo.py donnera la sortie :

/path1        # "import bar" causes the line "print(os.getcwd())" to run
/path2/bar.py # then "print(__file__)" runs
/path2/bar.py # then the import statement finishes and "print(bar.__file__)" runs

CEPENDANT, si vous essayez d'exécuter bar.py tout seul, vous obtiendrez :

/path2                              # "print(os.getcwd())" still works fine
Traceback (most recent call last):  # but __file__ doesn't exist if bar.py is running as main
  File "/path2/bar.py", line 3, in <module>
    print(__file__)
NameError: name '__file__' is not defined 

J'espère que cela vous aidera. Cette mise en garde m'a coûté beaucoup de temps et de confusion alors que je testais les autres solutions présentées.

7 votes

Dans ce cas, vous pouvez utiliser sys.argv[0] à la place de fichier .

4 votes

S'agit-il d'une mise en garde spécifique à une version ? Dans les versions 2.6 et 2.7, j'ai réussi à faire confiance à fichier Ce fichier fonctionne lorsque name__=='__main '. Le seul cas d'échec que j'ai vu est avec "python -c 'print'". fichier '". J'ajouterai que parfois fichier peut être '<stdin>', ce qui se produit lorsque des IDE comme emacs exécutent le tampon actuel.

1 votes

Notez que les caractères "__" en tête et en queue mettent un mot en gras, donc gardez cela à l'esprit en lisant les commentaires précédents :-P

61voto

jpgeek Points 1673

Je vais essayer de m'attaquer à quelques variations de cette question également :

  1. trouver le chemin du script appelé
  2. Trouver le chemin du script en cours d'exécution.
  3. trouver le répertoire du script appelé

(Certaines de ces questions ont été posées sur SO, mais ont été fermées en tant que doublons et redirigées ici).

Mises en garde concernant l'utilisation __file__

Pour un module que vous avez importé :

import something
something.__file__ 

retournera le absolu chemin du module. Cependant, étant donné le script suivant foo.py :

#foo.py
print '__file__', __file__

L'appeler avec 'python foo.py' retournera simplement 'foo.py'. Si vous ajoutez un shebang :

#!/usr/bin/python 
#foo.py
print '__file__', __file__

et l'appeler en utilisant ./foo.py, il retournera './foo.py'. Si vous l'appelez à partir d'un autre répertoire (par exemple, mettez foo.py dans le répertoire bar), puis appelez soit

python bar/foo.py

ou ajouter un shebang et exécuter le fichier directement :

bar/foo.py

renverra 'bar/foo.py' (l'option relatif chemin).

Trouver le répertoire

Maintenant, il faut partir de là pour obtenir le répertoire, os.path.dirname(__file__) peut également s'avérer délicat. Au moins sur mon système, il retourne une chaîne vide si vous l'appelez depuis le même répertoire que le fichier. ex.

# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)

produira un résultat :

__file__ is: foo.py
os.path.dirname(__file__) is: 

En d'autres termes, il renvoie une chaîne vide, ce qui ne semble pas fiable si vous voulez l'utiliser pour l'actuel fichier (par opposition à la fichier d'un module importé). Pour contourner ce problème, vous pouvez l'envelopper dans un appel à abspath :

# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))

ce qui donne quelque chose comme :

os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar

Notez que abspath() ne résout PAS les liens symboliques. Si vous voulez le faire, utilisez realpath() à la place. Par exemple, créer un lien symbolique file_import_testing_link pointant vers file_import_testing.py, avec le contenu suivant :

import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)

L'exécution imprimera les chemins absolus comme suit :

abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py

fichier_import_testing_lien -> fichier_import_testing.py

Utilisation de l'inspection

@SummerBreeze mentionne l'utilisation des inspecter module.

Cela semble bien fonctionner, et est assez concis, pour les modules importés :

import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)

renvoie docilement le chemin absolu. Pour trouver le chemin du script en cours d'exécution :

inspect.getfile(inspect.currentframe())

(merci @jbochi)

1 votes

inspect.getfile(os) est identique à os.__file__ du code : def getfile(object) : """Déterminer dans quel fichier source ou compilé un objet a été défini.""" if ismodule(object) : if hasattr(object, ' fichier ') : return object.__file__

1 votes

Cela devrait être la réponse acceptée. Merci pour cette réponse exhaustive.

1 votes

Ajoutant ici que inspect.getabsfile(inspect.currentframe()) donne le chemin absolu du script en cours d'exécution.

17voto

vinoth Points 119
import os
path = os.path.abspath(__file__)
dir_path = os.path.dirname(path)

1 votes

ne fonctionne pas sur mon Linux python 2.6 puisque __file__ est juste dir/test.py, abspath implique le cwd pour compléter le nom du chemin ce qui n'est pas le résultat souhaité, mais si vous importez un module alors m.__file__ donne le résultat souhaité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X