2012-03-23 4 views
26

Ich schreibe einen Komponententest, der auf eine Bilddatei zugreifen muss, die ich in das Verzeichnis "Fixtures" direkt unter meinem django-App-Verzeichnis lege. Ich möchte diese Bilddatei in meinem Test öffnen, indem ich den relativen Pfad nutze, was mich dazu zwingen würde, den absoluten Pfad der Django-App zu erhalten. Gibt es eine Möglichkeit, den absoluten Weg der Django App zu bekommen?Absoluter Pfad der Django-App

Antwort

41

Python-Module (einschließlich Django apps) ein __file__ Attribut, das Sie den Speicherort ihrer __init__.py Datei auf dem Dateisystem, so

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

sollte das tun, was Sie wollen, erzählt.

Unter normalen Umständen, os.path.absname(appname.__path__[0]), aber es ist für Apps möglich, das zu ändern, wenn sie Dateien auf eine seltsame Weise importieren möchten.

(Ich mache immer PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) in meinem settings.py, obwohl -. Für die verschiedenen Einstellungen macht es einfach, die absoluten Pfade sein müssen)

+1

Dies ist eigentlich nicht korrekt, weil appname .__ path__ ist list, keine Zeichenfolge. Siehe http://docs.python.org/2/tutorial/modules.html#packages-in-multiple-directories –

+5

@GeorgeLund Du hast natürlich Recht; Dumm von mir. Du könntest 'appname .__ Pfad __ [0]', obwohl es scheint, dass es möglich ist, das zu ändern; Sie können auch 'os.path.dirname (Anwendungsname .__ Datei __)' verwenden, da '__file__' auf die Datei' __init__py' zeigt. – Dougal

+0

Können Sie Ihre Antwort so ändern, dass sie zu Ihrem Kommentar passt, weil die Antwort die meisten Leute zuerst sehen. – Igor

11

Normalerweise ist dies das, was ich in meiner settings.py-Datei hinzufüge, damit ich auf das Projekt root verweisen kann.

import os.path 

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

Diese Methode wird das Verzeichnis aller Python-Dateien abrufen.

+0

, die intelligent ist, aber es gibt den Pfad zu dem Projekt nicht auf die App . In meinem Fall wird es gut funktionieren, weil im Dateisystem meine App unter dem Projekt lebt, sonst würde es nicht machen. Gibt es eine Möglichkeit, den Weg zur App zu finden? Oder ist das das, was ich am nächsten bekomme? – tamakisquare

+0

Sie könnten es in einer Datei verwenden, die sich in der App befindet, oder den Pfad zur App innerhalb des Ordners an PROJECT_ROOT mit os.path.join() anhängen – Kekoa

+0

Danke :) – tamakisquare