Подтвердить что ты не робот

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(), и мой сайт работает нормально, но мне любопытно, что может быть здесь:)

Кто-нибудь знает?

4b9b3361

Ответ 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) вы тестируете в одной среде и работаете в другой.