web-dev-qa-db-fra.com

Obtenir le chemin absolu de l'application Django

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?

28
tamakisquare

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.)

48
Dougal

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.

12
Kekoa

La réponse acceptée fonctionne donc généralement bien. Cependant, pour

  • paquets d'espace de noms avec plusieurs chemins, ou
  • des applications qui configurent explicitement leurs chemins dans la configuration,

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)
6
thclark

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")

0
Nik