Разница между os.path.dirname(os.path.abspath(__file__)) и os.path.dirname(__file__)

Я новичок, работаю над проектом Django. Файл Settings.py проекта Django содержит следующие две строки:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

Я хочу знать разницу, поскольку я думаю, что оба указывают на один и тот же каталог. Также было бы здорово, если бы вы могли предоставить некоторые ссылки на функции os.path.


person Rishabh Agrahari    schedule 16.07.2016    source источник
comment
Вы оба пробовали и сравнивали?   -  person Jonathon Reinhart    schedule 16.07.2016
comment
Нет, они не указывают на один и тот же каталог.   -  person Martijn Pieters    schedule 16.07.2016


Ответы (1)


BASE_DIR указывает на родительский каталог PROJECT_ROOT. Вы можете переписать два определения как:

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(PROJECT_ROOT)

потому что функция os.path.dirname() просто удаляет последний сегмент пути.

В приведенном выше примере имя __file__ указывает на имя файла текущего модуля, см. Модель данных Python:

__file__ — это путь к файлу, из которого был загружен модуль, если он был загружен из файла.

Однако это может быть относительный путь, поэтому os.path.abspath() используется для преобразования его в абсолютный путь перед удалением только имени файла и сохранением полного пути к каталогу, в котором находится модуль, в PROJECT_ROOT.

person Martijn Pieters    schedule 16.07.2016