С помощью почты Guido, предоставленной @kindall, мы можем понять стандартный процесс импорта как попытку найти модуль в каждом члене sys.pathи файле в результате этого поиска (более подробно в PyMOTW Modules and Imports .). Таким образом, если модуль расположен на абсолютном пути, sys.pathрезультат будет абсолютным, но если он расположен на относительном пути, sys.pathрезультат будет относительным.
Теперь site.pyфайл запуска заботится о доставке только абсолютного пути sys.path, кроме начального '', поэтому, если вы не измените его иным способом, кроме установки PYTHONPATH (чей путь также делается абсолютным, перед префиксом sys.path), вы всегда получите абсолютный путь, но когда доступ к модулю осуществляется через текущий каталог.
Теперь, если вы забавным образом обманете sys.path, вы сможете получить все, что угодно.
В качестве примера , если у вас есть модуль образца foo.pyв /tmp/с кодом:
import sys
print(sys.path)
print (__file__)
Если вы войдете в / tmp, вы получите:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Когда вы входите /home/user, если вы добавляете /tmpсвой, PYTHONPATHвы получаете:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
Даже если вы добавите ../../tmp, он будет нормализован и результат будет таким же.
Но если вместо использования PYTHONPATHвы напрямую используете какой-нибудь забавный путь, вы получите такой же забавный результат, как и причина.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Гвидо объясняет в процитированном выше потоке, почему python не пытается преобразовать все записи в абсолютные пути:
мы не хотим вызывать getpwd () при каждом импорте .... getpwd () относительно медленный и иногда может полностью выйти из строя,
Итак, ваш путь используется как есть .