J'écris un test unitaire qui doit accéder à un fichier image que je mets dans le répertoire "fixtures" juste sous mon répertoire app Django. Je veux ouvrir ce fichier image dans mon test en utilisant un chemin relatif, ce qui m'obligerait à obtenir le chemin absolu de l'application Django. Existe-t-il un moyen d'obtenir le chemin absolu de l'application Django?
Les modules Python (y compris les applications Django) ont un attribut __file__
qui vous indique l'emplacement de leur fichier __init__.py
sur le système de fichiers.
import appname
pth = os.path.dirname(appname.__file__)
devrait faire ce que vous voulez.
Dans les circonstances habituelles, os.path.absname(appname.__path__[0])
, mais il est possible pour les applications de changer cela si elles veulent importer des fichiers de manière étrange.
(Je fais toujours PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
dans mon settings.py
, cependant - cela facilite la tâche pour les divers paramètres qui doivent être des chemins absolus.)
Normalement, c’est ce que j’ajoute dans mon fichier settings.py pour pouvoir référencer la racine du projet.
import os.path
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
Cette méthode obtiendra le répertoire de n’importe quel fichier python.
La réponse acceptée fonctionne donc généralement bien. Cependant, pour
leur chemin prévu peut ne pas correspondre à l'attribut __file__
du module.
Django (1.7+) fournit l'attribut AppConfig.path
- qui, à mon avis, est plus clair même dans les cas simples et couvre également ces cas Edge.
Les documents de l'application vous indiquent comment obtenir l'objet AppConfig. Donc, pour obtenir AppConfig et en imprimer le chemin:
from Django.apps import apps
print(apps.get_app_config('your.app.name').path)
Gardez à l'esprit que appname.__path__
est une liste:
import appname
APP_ROOT = os.path.abspath(appname.__path__[0])
file_path = os.path.join(APP_ROOT, "some_file.txt")