2012-03-23 20 views
26

Sto scrivendo un test unitario che deve accedere a un file immagine che ho inserito nella directory "fixtures" proprio sotto la mia directory app django. Voglio aprire questo file immagine nel mio test utilizzando il percorso relativo, che mi richiederebbe di ottenere il percorso assoluto dell'app django. C'è un modo per ottenere il percorso assoluto dell'app django?Ottieni il percorso assoluto dell'app django

risposta

41

moduli Python (incluse le applicazioni Django) hanno un attributo __file__ che ti dice la posizione del proprio file __init__.py sul filesystem, in modo

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

dovrebbe fare quello che vuoi.

In circostanze normali, os.path.absname(appname.__path__[0]), ma è possibile che le app cambino se vogliono importare file in modo strano.

(io faccio sempre PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) nel mio settings.py, anche se -. Lo rende facile per le varie impostazioni che devono essere percorsi assoluti)

+1

Questo non è effettivamente corretto perché appname .__ path__ è lista, non una stringa. Vedi http://docs.python.org/2/tutorial/modules.html#packages-in-multiple-directories –

+5

@GeorgeLund Hai ragione, naturalmente; sciocco da parte mia. Si potrebbe fare 'appname .__ path __ [0]', anche se sembra che sia possibile cambiarlo; si potrebbe anche usare 'os.path.dirname (appname .__ file __)', poiché '__file__' punta al file' __init __. py'. – Dougal

+0

Puoi modificare la risposta in modo che corrisponda al tuo commento perché la risposta è ciò che la maggior parte delle persone vede prima. – Igor

11

Normalmente, questo è ciò che aggiungo nel mio file settings.py così posso fare riferimento alla radice del progetto.

import os.path 

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) 

Questo metodo otterrà la directory di qualsiasi file python.

+0

Questo è intelligente, ma dà il percorso per il progetto non al app . Nel mio caso, funzionerà bene perché, nel filesystem, la mia app vive sotto il progetto, altrimenti non lo farebbe. C'è un modo in cui posso effettivamente ottenere il percorso per l'app? O è questo il più vicino che posso ottenere? – tamakisquare

+0

È possibile utilizzarlo all'interno di un file che si trova nell'app o aggiungere il percorso all'app all'interno della cartella su PROJECT_ROOT utilizzando os.path.join() – Kekoa

+0

. Grazie :) – tamakisquare

Problemi correlati