Dieser Code enthält die Vorlagen / blog1 / page.html in b.py:
path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))
aber ich möchte den übergeordneten Verzeichnisspeicherort erhalten:
aParent
|--a
| |---b.py
| |---templates
| |--------blog1
| |-------page.html
|--templates
|--------blog1
|-------page.html
und wie man den aParent-Standort erhält
Vielen Dank
Aktualisiert:
Dies ist richtig:
dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))
oder
path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
blog1
odera
? Und wo befindet sich Ihre aktuelle Datei?os.path.join('templates', 'blog1/page.html')
sieht für mich seltsam aus. Sie vermischen die Dinge. Entwederos.path.join('templates', 'blog1', 'page.html')
oder'templates/blog1/page.html'
. Und viel einfacher wäreos.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
dannAntworten:
Sie können dirname wiederholt anwenden, um höher zu klettern :
dirname(dirname(file))
. Dies kann jedoch nur bis zum Root-Paket gehen. Wenn dies ein Problem ist, verwenden Sieos.path.abspath
:dirname(dirname(abspath(file)))
.quelle
dirname
. Es ist nicht für alle offensichtlich, dass das Anwenden von dirname auf ein Verzeichnis das übergeordnete Verzeichnis ergibt.dirname
gibt NICHT immer das übergeordnete Verzeichnis zurück; twitter.com/#!/ActiveState/status/671049326788608/
als nicht den Blattverzeichniseintrag selbst darstellend, sondern dessen Inhalt, weshalb z. B.mv xxx yyy/
fehlschlägt, wennyyy
es sich nicht um ein bereits vorhandenes Verzeichnis handelt. In jedem Fall ist es im Kontext meiner Antwort irrelevant, auch wenn wir Ihren Standpunkt als gegeben betrachten. Wederfile
noch das Ergebnis vondirname
wird jemals in a enden/
.dirname
Kann zurückkehren'/'
, was eindeutig in a endet/
. Das ist die einzige Ausnahme, AFAIK.os.path.abspath
validiert nichts. Wenn wir also bereits Zeichenfolgen anhängen, müssen Sie__file__
sich nicht darum kümmerndirname
oder beitreten oder irgendetwas davon. Behandle es einfach__file__
als Verzeichnis und beginne zu klettern:Das ist weit weniger kompliziert als
os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
und ungefähr so überschaubar wiedirname(dirname(__file__))
. Das Klettern in mehr als zwei Levels wird langsam lächerlich.Da wir jedoch wissen, wie viele Ebenen zu erklimmen sind, können wir dies mit einer einfachen kleinen Funktion bereinigen:
quelle
os.path.abspath(os.path.join(__file__, "..", "..")
tragbarer?Verwenden Sie den relativen Pfad mit dem
pathlib
Modul in Python 3.4+:Sie können mehrere Aufrufe verwenden
parent
, um den Pfad weiter zu verfolgen:Alternativ zur
parent
zweimaligen Angabe können Sie Folgendes verwenden:quelle
str(Path(__file__).parent)
.Sollte dir den Weg geben
a
.Wenn
b.py
es sich jedoch um die Datei handelt, die gerade ausgeführt wird, können Sie dasselbe erreichen, indem Sie dies einfach tunquelle
dirname()
Zweimal auftragen . Alles, was Sie jetzt brauchen, sollte auf dieser Seite sein.os.pardir
ist ein besserer Weg../
und besser lesbar.Dies gibt den übergeordneten Pfad des angegebenen Pfads zurück
quelle
Ein einfacher Weg kann sein:
quelle
Kann zwei
..
Ordner verbinden, um Eltern des übergeordneten Ordners zu bekommen?quelle
Verwenden Sie Folgendes, um zum vorherigen Ordner zu springen:
Wenn Sie mehrere Sprünge benötigen, ist es in diesem Fall eine gute und einfache Lösung, einen einfachen Dekorateur zu verwenden.
quelle
Hier ist eine andere relativ einfache Lösung, die:
dirname()
(was bei einstufigen Argumenten wie "file.txt" oder relativen Eltern wie ".." nicht wie erwartet funktioniert)abspath()
(wobei Annahmen über das aktuelle Arbeitsverzeichnis vermieden werden), sondern behält den relativen Charakter von Pfaden beies verwendet nur
normpath
undjoin
:Ergebnis:
quelle
Ich denke, dies zu verwenden ist besser:
quelle
Ich habe es versucht:
quelle