J'ai du mal à comprendre __file__
. D'après ce que je comprends, __file__
renvoie le chemin absolu à partir duquel le module a été chargé.
J'ai du mal à produire ceci: j'ai abc.py
une instruction avec une print __file__
, exécutée à partir de /d/projects/
python abc.py
retours abc.py
. fuyant les /d/
retours projects/abc.py
. Des raisons pourquoi?
Réponses:
De la documentation :
Depuis le fil de discussion de la liste de diffusion lié par @kindall dans un commentaire à la question:
Pour le reste, pensez à
sys.path
ne pas inclure''
.Donc, si vous êtes en dehors de la partie de
sys.path
celle qui contient le module, vous obtiendrez un chemin absolu . Si vous êtes dans la partiesys.path
qui contient le module, vous obtiendrez un chemin relatif .Si vous chargez un module dans le répertoire courant et le répertoire courant n'est pas dans
sys.path
, vous aurez un chemin absolu.Si vous chargez un module dans le répertoire courant et que le répertoire courant est dans
sys.path
, vous obtiendrez un chemin relatif.la source
sys.path
, vous aurez un chemin absolu. Si vous chargez un module dans le répertoire courant et que le répertoire courant est danssys.path
, vous obtiendrez un chemin relatif.sys.path
n'inclut pas''
.__file__
est absolu depuis Python 3.4 , sauf lors de l'exécution d'un script directement en utilisant un chemin relatif:Je ne sais pas si cela résout les liens symboliques.
Exemple de passage d'un chemin relatif:
la source
Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux
). Et les liens symboliques ne sont pas résolus dans mes essais.os.path.realpath(__file__)
la bonne façon de résoudre les liens symboliques?Exemple simple tardif:
Sous Python-2. *, Le deuxième appel détermine de manière incorrecte le en
path.abspath(__file__)
fonction du répertoire actuel:Comme indiqué par @techtonik, dans Python 3.4+, cela fonctionnera bien car
__file__
renvoie un chemin absolu.la source
__main__
module, où__file__
peut être un chemin relatif.Avec l'aide du courrier de Guido fourni par @kindall, nous pouvons comprendre le processus d'importation standard comme une tentative de trouver le module dans chaque membre de
sys.path
, et le fichier à la suite de cette recherche (plus de détails dans Modules PyMOTW et importations .). Donc si le module est situé dans un chemin absolu danssys.path
le résultat est absolu, mais s'il est situé dans un chemin relatif danssys.path
le résultat est relatif.Maintenant, le
site.py
fichier de démarrage se charge de ne fournir que le chemin absolusys.path
, sauf l'initiale''
, donc si vous ne le modifiez pas par un autre moyen que de définir le PYTHONPATH (dont le chemin est également rendu absolu, avant de préfixersys.path
), vous obtiendrez toujours un absolu chemin, mais lorsque le module est accédé via le répertoire courant.Maintenant, si vous trompez sys.path d'une manière amusante, vous pouvez obtenir n'importe quoi.
A titre d' exemple , si vous avez un module échantillon
foo.py
dans/tmp/
le code:Si vous entrez dans / tmp, vous obtenez:
Lorsque
/home/user
vous y êtes, si vous ajoutez/tmp
votre,PYTHONPATH
vous obtenez:Même si vous ajoutez
../../tmp
, il sera normalisé et le résultat est le même.Mais si au lieu d'utiliser
PYTHONPATH
vous utilisez directement un chemin amusant, vous obtenez un résultat aussi amusant que la cause.Guido explique dans le fil de discussion cité ci-dessus, pourquoi python n'essaye pas de transformer toutes les entrées en chemins absolus:
Donc, votre chemin est utilisé tel quel .
la source