Solución:
Los módulos de Python (incluidas las aplicaciones de Django) tienen una __file__
atributo que le dice la ubicación de su __init__.py
archivo en el sistema de archivos, por lo que
import appname
pth = os.path.dirname(appname.__file__)
debe hacer lo que quiera.
En circunstancias habituales, os.path.absname(appname.__path__[0])
, pero es posible que las aplicaciones cambien eso si quieren importar archivos de una manera extraña.
(Yo siempre lo hago PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
en mi settings.py
, sin embargo, facilita las diversas configuraciones que deben ser rutas absolutas).
Normalmente, esto es lo que agrego en mi archivo settings.py para poder hacer referencia a la raíz del proyecto.
import os.path
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
Este método obtendrá el directorio de cualquier archivo de Python.
Entonces, la respuesta aceptada generalmente funciona bien. Sin embargo, para
-
paquetes de espacio de nombres con múltiples rutas, o
- aplicaciones que configuran explícitamente sus rutas en la configuración,
su camino previsto puede no estar de acuerdo con el __file__
atributo del módulo.
Django (1.7+) proporciona la AppConfig.path
atributo, que creo que es más claro incluso en casos simples, y que también cubre estos casos extremos.
Los documentos de la aplicación le dicen cómo obtener el objeto AppConfig. Entonces, para obtener AppConfig e imprimir la ruta desde él:
from django.apps import apps
print(apps.get_app_config('app_label').path)
Editar: ejemplo modificado de cómo usar get_app_config
para eliminar puntos, lo que parece haber sido confuso. Aquí están los documentos como referencia.