За допомогою пошти Guido, наданої @kindall, ми можемо зрозуміти стандартний процес імпорту як намагання знайти модуль у кожного учасника sys.pathта подати файл у результаті цього пошуку (детальніше в модулях PyMOTW і 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
У цитованій вище темі Гуїдо пояснює, чому пітон не намагається перетворити всі записи в абсолютні шляхи:
ми не хочемо викликати getpwd () під час кожного імпорту .... getpwd () є відносно повільним і іноді може вийти з ладу прямо,
Тож ваш шлях використовується таким, яким він є .