2012-03-23 21 views
26

Estoy escribiendo una prueba de unidad que necesita acceder a un archivo de imagen que puse en el directorio "fixtures" directamente debajo de mi directorio de aplicaciones django. Quiero abrir este archivo de imagen en mi prueba utilizando una ruta relativa, lo que me obligaría a obtener la ruta absoluta de la aplicación django. ¿Hay alguna manera de obtener la ruta absoluta de la aplicación django?Obtener la ruta absoluta de la aplicación django

Respuesta

41

módulos de Python (incluyendo aplicaciones Django) tienen un atributo __file__ que le indica la ubicación de su archivo __init__.py en el sistema de archivos, por lo

import appname 
pth = os.path.dirname(appname.__file__) 

debe hacer lo que quiera.

En circunstancias normales, os.path.absname(appname.__path__[0]), pero es posible que las aplicaciones cambien si quieren importar archivos de una manera extraña.

(Yo siempre hago PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) en mi settings.py, aunque -. Hace que sea fácil para los distintos ajustes que deben ser rutas absolutas)

+1

Esto no es realmente correcto porque el nombre de aplicación .__ path__ es una lista, no una cadena. Ver http://docs.python.org/2/tutorial/modules.html#packages-in-multiple-directories –

+5

@GeorgeLund Tienes razón, por supuesto; tonto de mi. Podrías hacer 'appname .__ path __ [0]', aunque parece que es posible cambiar eso; también puede usar 'os.path.dirname (appname .__ file __)', ya que '__file__' apunta al archivo' __init __. py'. – Dougal

+0

Puedes cambiar tu respuesta para que coincida con tu comentario porque la respuesta es lo que la mayoría de la gente ve primero. – Igor

11

Normalmente, esto es lo que agrego en mi archivo settings.py para poder hacer referencia al directorio 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 python.

+0

Eso es inteligente, pero le da la ruta del proyecto no a la aplicación . En mi caso, funcionará bien porque, en el sistema de archivos, mi aplicación vive bajo el proyecto, de lo contrario no funcionaría. ¿Hay alguna forma en que realmente pueda obtener el camino a la aplicación? ¿O es esto lo más cercano que puedo obtener? – tamakisquare

+0

Podría usarlo dentro de un archivo que esté en la aplicación, o anexar la ruta a la aplicación dentro de la carpeta al PROYECTO_ROOT utilizando os.path.join() – Kekoa

+0

. Gracias :) – tamakisquare

Cuestiones relacionadas