Avec l'aide de l'Guido mail fournie par @kindall, nous pouvons comprendre la norme processus d'importation que d'essayer de trouver le module de chacun des membres de l' sys.path
, et le fichier comme étant le résultat de cette recherche (plus de détails dans PyMOTW Modules et les Importations.). Donc, si le module est situé dans un chemin d'accès absolu en sys.path
le résultat est absolue, mais si elle est située dans un chemin relatif en sys.path
le résultat est relatif.
Maintenant l' site.py
fichier de démarrage prend soin de ne fournir que de chemin d'accès absolu en sys.path
, à l'exception du premier ''
, donc si vous ne l'avez pas changé par d'autres moyens que de fixer le PYTHONPATH (dont le chemin d'accès sont également fait absolue, avant la préfixation sys.path
), vous obtiendrez toujours un chemin absolu, mais lorsque le module est accessible via le répertoire courant.
Maintenant, si vous vous leurrez sys.chemin dans une drôle de façon, vous pouvez obtenir quoi que ce soit.
À titre d'exemple, si vous avez un exemple de module foo.py
en /tmp/
avec le code:
import sys
print(sys.path)
print (__file__)
Si vous allez dans /tmp, vous bénéficiez de:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Lorsque en en /home/user
, si vous ajoutez /tmp
votre PYTHONPATH
vous 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 PYTHONPATH
vous utilisez directement drôles de chemin
vous obtenez un résultat aussi drôle que la cause.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido explique dans la citée ci-dessus fil, pourquoi python ne pas essayer de transformer toutes les entrées dans les chemins d'accès absolus:
nous ne voulons pas avoir à appeler getpwd() sur chaque importation ....
getpwd() est relativement lente et peut parfois échouer le coup,
Si votre chemin est utilisé comme il est.