Con la ayuda del correo de Guido proporcionado por @kindall, podemos entender el proceso de importación estándar como tratar de encontrar el módulo en cada miembro de sys.pathy el archivo como resultado de esta búsqueda (más detalles en PyMOTW Modules and Imports .). Entonces, si el módulo está ubicado en una ruta absoluta, sys.pathel resultado es absoluto, pero si está ubicado en una ruta relativa, sys.pathel resultado es relativo.
Ahora el site.pyarchivo de inicio se encarga de entregar solo la ruta absoluta sys.path, excepto la inicial '', por lo que si no lo cambia por otros medios que no sean la configuración de PYTHONPATH (cuya ruta también se hace absoluta, antes de prefijar sys.path), obtendrá siempre un valor absoluto ruta, pero cuando se accede al módulo a través del directorio actual.
Ahora, si engaña a sys.path de una manera divertida, puede obtener cualquier cosa.
Como ejemplo, si tiene un módulo de muestra foo.pyen /tmp/el código:
import sys
print(sys.path)
print (__file__)
Si entra / tmp obtiene:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Cuando /home/userestás adentro , si agregas /tmptu PYTHONPATHobtienes:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
Incluso si agrega ../../tmp, se normalizará y el resultado será el mismo.
Pero si en lugar de usar PYTHONPATHusas directamente algún camino divertido obtienes un resultado tan divertido como la causa.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido explica en el hilo citado anteriormente, por qué Python no intenta transformar todas las entradas en rutas absolutas:
no queremos tener que llamar a getpwd () en cada importación .... getpwd () es relativamente lento y, a veces, puede fallar por completo,
Entonces tu camino se usa como está .