Os.getcwd() vs os.path.abspath(os.path.dirname(__ file__))
Я использую модуль os, чтобы иметь относительные пути в моих проектах settings.py
проектов Django. Переменная SITE_ROOT установлена в текущий рабочий каталог файла settings.py
, а затем используется для ссылки на все каталоги static/media
, также расположенные в том же каталоге.
Вот моя проблема:
print os.getcwd()
print os.path.abspath(os.path.dirname(__file__))
В settings.py указанные выше утверждения имеют одинаковые выходы. но мой шаблон будет загружаться, только если я использую SITE_ROOT = os.path.abspath(os.path.dirname(__file__))
Django ищет шаблоны здесь:
TEMPLATE_DIRS = (
os.path.join(SITE_ROOT, 'templates'),
)
SITE_ROOT, установленный в os.getcwd()
, кажется, заставляет Django искать папку шаблонов в каталоге ABOVE settings.py
file
Я так же легко не могу использовать os.getcwd()
, и мой сайт работает нормально, но мне любопытно, что может быть здесь:)
Кто-нибудь знает?
Ответы
Ответ 1
Как сказал муад, os.getcwd()
не даст вам именно то, что вы ожидаете.
os.getcwd()
выполняет немного больше, чем возвращает текущий рабочий каталог. По умолчанию он равен $PWD в вашем env. Это не там, где находится script, но где вы были, когда вы выполнили script.
Будучи в /home/user
и делая python manage.py
, os.getcwd()
вернет /home/user
Находясь в /home/
и делая python user/manage.py
, os.getcwd()
вернет /home
Но это все равно будет не всегда истинным, так как можно использовать os.chdir()
. Другим словом является cd
. Он также изменит возвращаемое значение os.getcwd()
.
С другой стороны. __file__
- это путь к файлу модуля. Поэтому вы должны использовать это, чтобы быть уверенным, что у вас есть путь относительно вашего модуля вместо текущего рабочего каталога, который может измениться.
Как сказал ShawnFumo, __file__
может быть не всегда абсолютным. Чтобы лучше понять, как это работает, вы можете проверить этот ответ: атрибут Python __file__
. Кроме того, с Python3.4 __file__
всегда должен быть абсолютный путь.
Надеюсь, что это ясно.
Ответ 2
Команда os.path.abspath(os.path.dirname(__file__))
возвращает каталог, в котором хранится файл кода, но os.getcwd()
предоставляет вам текущий рабочий каталог, который по умолчанию используется для выполнения кода, последний может быть изменен с помощью команды os.chdir()
.
Ответ 3
os.getcwd()
будет не указывать путь, где находится settings.py
, и он даст вам путь, из которого выполняется script (в вашем случае manage.py
).
Ответ 4
Если два оператора, которые вы показываете, действительно имеют одинаковый вывод, то либо они должны работать. Итак, либо: 1) они немного отличаются, например, у одного есть конечная косая черта, другая - нет, или 2) вы тестируете в одной среде и работаете в другой.