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 dans sys.pathle résultat est absolu, mais s'il est situé dans un chemin relatif danssys.path le résultat est relatif.
Maintenant, le site.pyfichier de démarrage se charge de ne fournir que le chemin absolu sys.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.pydans /tmp/le code:
import sys
print(sys.path)
print (__file__)
Si vous entrez dans / tmp, vous obtenez:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Lorsque /home/uservous y êtes, si vous ajoutez /tmpvotre, PYTHONPATHvous obtenez:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
Même si vous ajoutez ../../tmp, il sera normalisé et le résultat est le même.
Mais si au lieu d'utiliser PYTHONPATHvous utilisez directement un chemin amusant, vous obtenez un résultat aussi amusant que la cause.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido explique dans le fil de discussion cité ci-dessus, pourquoi python n'essaye pas de transformer toutes les entrées en chemins absolus:
nous ne voulons pas avoir à appeler getpwd () à chaque import ... getpwd () est relativement lent et peut parfois échouer carrément,
Donc, votre chemin est utilisé tel quel .