Получить абсолютный путь к приложению Django - PullRequest
28 голосов
/ 24 марта 2012

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

Ответы [ 4 ]

49 голосов
/ 27 марта 2012

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

12 голосов
/ 24 марта 2012

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

import os.path

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

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

6 голосов
/ 17 апреля 2018

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

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

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

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

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

from django.apps import apps
print(apps.get_app_config('your.app.name').path)
0 голосов
/ 21 января 2019

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

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

...