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
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)
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.
, 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
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
Danke :) – tamakisquare
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 –
@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
Können Sie Ihre Antwort so ändern, dass sie zu Ihrem Kommentar passt, weil die Antwort die meisten Leute zuerst sehen. – Igor