it-swarm.com.ru

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

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

28
tamakisquare

Модули 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, хотя - облегчает различные настройки, которые должны быть абсолютными путями.)

48
Dougal

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

import os.path

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

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

12
Kekoa

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

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

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

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

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

from Django.apps import apps
print(apps.get_app_config('your.app.name').path)
6
thclark

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

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

0
Nik