Я пишу unit test, который должен получить доступ к файлу изображения, который я помещал в каталог "fixtures" прямо под моим каталогом приложений django. Я хочу открыть этот файл изображения в своем тесте, используя относительный путь, который потребует от меня получить абсолютный путь к приложению django. Есть ли способ получить абсолютный путь к приложению django?
Получить абсолютный путь к приложению django
Ответ 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")