J'essaierai également d'aborder quelques variantes de cette question:
- trouver le chemin du script appelé
- trouver le chemin du script en cours d'exécution
- 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__
renverra le chemin absolu du module. Cependant, étant donné le script foo.py suivant:
#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 appelez-le en utilisant ./foo.py, il renverra './foo.py'. L'appeler à partir d'un répertoire différent (par exemple, mettre foo.py dans la barre de répertoire), puis appeler soit
python bar/foo.py
ou en ajoutant un shebang et en exécutant le fichier directement:
bar/foo.py
renverra «bar / foo.py» (le parent chemin ).
Trouver le répertoire
Maintenant, aller à partir de là pour obtenir le répertoire, os.path.dirname(__file__)
peut aussi être difficile. Au moins sur mon système, il renvoie 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__)
affichera:
__file__ is: foo.py
os.path.dirname(__file__) is:
En d'autres termes, il renvoie une chaîne vide, donc cela ne semble pas fiable si vous souhaitez l'utiliser pour le fichier actuel (par opposition au fichier d'un module importé). Pour contourner cela, 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__))
qui génère 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 plutôt realpath (). 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 affichera des chemins absolus quelque chose comme:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
Utilisation d'inspecter
@SummerBreeze mentionne l'utilisation de l' inspection module d' .
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. Cependant, pour trouver le chemin du script en cours d'exécution, je n'ai pas vu de moyen de l'utiliser.