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

Получить абсолютный путь к приложению django

Я пишу unit test, который должен получить доступ к файлу изображения, который я помещал в каталог "fixtures" прямо под моим каталогом приложений django. Я хочу открыть этот файл изображения в своем тесте, используя относительный путь, который потребует от меня получить абсолютный путь к приложению django. Есть ли способ получить абсолютный путь к приложению django?

4b9b3361

Ответ 1

Модули Python (включая приложения Django) имеют атрибут __file__, который сообщает вам местоположение их файла __init__.py в файловой системе, поэтому

import appname
pth = os.path.dirname(appname.__file__)

должен делать то, что вы хотите.

В обычных обстоятельствах os.path.absname(appname.__path__[0]), но это возможно для приложений, чтобы изменить это, если они хотят импортировать файлы странным способом.

(я всегда делаю PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) в моем settings.py, однако - упрощает различные настройки, которые должны быть абсолютными путями.)

Ответ 2

Обычно это то, что я добавляю в свой файл settings.py, чтобы я мог ссылаться на корень проекта.

import os.path

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

Этот метод получит каталог любого файла python.

Ответ 3

Таким образом, принятый ответ обычно работает нормально. Однако для

  • пакеты пространства имен с несколькими путями, или
  • приложения, которые явно настраивают свои пути в конфигурации,

их предполагаемый путь может не совпадать с атрибутом __file__ модуля.

Джанго (1. 7+) предоставляет атрибут AppConfig.path - который, я думаю, более понятен даже в простых случаях и который также охватывает эти крайние случаи.

Документы приложения расскажут вам, как получить объект AppConfig. Итак, чтобы получить AppConfig и вывести из него путь:

from django.apps import apps
print(apps.get_app_config('your.app.name').path)

Ответ 4

Имейте в виду, что appname.__path__ - это список:

import appname
APP_ROOT = os.path.abspath(appname.__path__[0])
file_path = os.path.join(APP_ROOT, "some_file.txt")