У меня проблемы с пониманием __file__
. Насколько я понимаю, __file__
возвращает абсолютный путь, с которого был загружен модуль.
У меня проблема с этим: у меня есть оператор abc.py
with one print __file__
, работающий от /d/projects/
python abc.py
возвратов abc.py
. убегает от /d/
возвратов projects/abc.py
. По каким причинам?
Ответы:
Из документации :
Из цепочки рассылки, на которую ссылается @kindall в комментарии к вопросу:
В остальном
sys.path
не включайте''
.Итак, если вы находитесь за пределами той части,
sys.path
которая содержит модуль, вы получите абсолютный путь . Если вы находитесь внутри той части,sys.path
которая содержит модуль, вы получите относительный путь .Если вы загружаете модуль в текущем каталоге, и текущий каталог не в
sys.path
, вы получите абсолютный путь.Если вы загружаете модуль в текущий каталог, а текущий каталог находится внутри
sys.path
, вы получите относительный путь.источник
sys.path
, вы получите абсолютный путь. Если вы загружаете модуль в текущий каталог, а текущий каталог находится внутриsys.path
, вы получите относительный путь.sys.path
не включает''
.__file__
является абсолютным, начиная с Python 3.4 , кроме случаев, когда сценарий выполняется напрямую с использованием относительного пути:Не уверен, что он разрешает символические ссылки.
Пример прохождения относительного пути:
источник
Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux
). И в моих испытаниях символические ссылки не разрешаются.os.path.realpath(__file__)
правильный способ разрешить символические ссылки?Поздний простой пример:
В Python-2. * Второй вызов неверно определяет на
path.abspath(__file__)
основе текущего каталога:Как отмечает @techtonik, в Python 3.4+ это будет работать нормально, поскольку
__file__
возвращает абсолютный путь.источник
__main__
модуля, где__file__
может быть относительный путь.С помощью почты Guido, предоставленной @kindall, мы можем понять стандартный процесс импорта как попытку найти модуль в каждом члене
sys.path
и файле в результате этого поиска (более подробно в PyMOTW Modules and Imports .). Таким образом, если модуль расположен на абсолютном пути,sys.path
результат будет абсолютным, но если он расположен на относительном пути,sys.path
результат будет относительным.Теперь
site.py
файл запуска заботится о доставке только абсолютного путиsys.path
, кроме начального''
, поэтому, если вы не измените его иным способом, кроме установки PYTHONPATH (чей путь также делается абсолютным, перед префиксомsys.path
), вы всегда получите абсолютный путь, но когда доступ к модулю осуществляется через текущий каталог.Теперь, если вы забавным образом обманете sys.path, вы сможете получить все, что угодно.
В качестве примера , если у вас есть модуль образца
foo.py
в/tmp/
с кодом:Если вы войдете в / tmp, вы получите:
Когда вы входите
/home/user
, если вы добавляете/tmp
свой,PYTHONPATH
вы получаете:Даже если вы добавите
../../tmp
, он будет нормализован и результат будет таким же.Но если вместо использования
PYTHONPATH
вы напрямую используете какой-нибудь забавный путь, вы получите такой же забавный результат, как и причина.Гвидо объясняет в процитированном выше потоке, почему python не пытается преобразовать все записи в абсолютные пути:
Итак, ваш путь используется как есть .
источник