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 ?
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 ?
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.
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 ?
Je ne l'ai pas essayé, mais self.__file__ donne-t-il des résultats différents de ceux de __file__ ?
Il y a inspect
en python.
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'
Vous pouvez utiliser inspect
pour obtenir également le nom du fichier courant ; voir stackoverflow.com/a/50905/320036
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()
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.
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.
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
Je vais essayer de m'attaquer à quelques variations de cette question également :
(Certaines de ces questions ont été posées sur SO, mais ont été fermées en tant que doublons et redirigées ici).
__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).
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
@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)
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__
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.
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 pourexecfile()
le cas où__file__
produit un nom erroné en silence.2 votes
liés : Comment déterminer correctement le répertoire courant script en Python ?
2 votes
import pathlib, module; pathlib.Path(module.__file__).resolve().parent
Ceci est indépendant de la plateforme0 votes
module.__path__[0]
0 votes
J'utilise Jupter notebook et j'ai un autre fichier notebook appelé GetData et il y a une classe ABC. J'ai importé cette classe ABC dans un autre notebook.
from GetData import ABC
mais quand j'utilise inspect.getfile(GetData) ou print(GetData.__file__) j'obtiens le nom d'erreur GetData n'est pas défini ou attrinute. fichier non trouvé. Le problème est de modifier la classe ABC dont la fonction est appelée par le notebook qui l'importe et de voir que la sortie est toujours la même que l'ancien fichier. Mais si je fais les mêmes changements dans GetData et que je l'exécute à partir du notebook GetData, cela se reflète.