Ok ... Ich weiß nicht, wo das Modul x
ist, aber ich weiß, dass ich den Pfad zum Verzeichnis um zwei Ebenen erhalten muss.
Gibt es einen eleganteren Weg:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Lösungen für Python 2 und 3 sind willkommen!
Sie können pathlib
verwenden. Leider ist dies nur in der stdlib für Python 3.4 verfügbar. Wenn Sie eine ältere Version haben, müssen Sie eine Kopie von PyPI hier installieren. Dies sollte leicht mit pip
erfolgen.
from pathlib import Path
p = Path(__file__).parents[1]
print(p)
# /absolute/path/to/two/levels/up
Hierbei wird die Sequenz parents
verwendet, die den Zugriff auf die übergeordneten Verzeichnisse ermöglicht und das zweite Verzeichnis auswählt.
Beachten Sie, dass p
in diesem Fall eine Form von Path
-Objekt mit eigenen Methoden ist. Wenn Sie die Pfade als Zeichenfolge benötigen, können Sie str
aufrufen.
Sehr leicht:
Hier ist was du willst:
import os.path as path
two_up = path.abspath(path.join(__file__ ,"../.."))
Grüße Sebi
Ich würde das nur als dumm hinzufügen, aber auch, weil es Neulingen den potentiellen Nutzen von Aliasing-Funktionen und/oder Importen zeigt.
Nachdem ich es geschrieben habe, denke ich, dass dieser Code besser lesbar ist (d. H. Weniger Zeit, um die Absicht zu erfassen) als die anderen bisherigen Antworten, und Lesbarkeit ist (normalerweise) König.
from os.path import dirname as up
two_up = up(up(__file__))
Hinweis: Sie möchten dies nur tun, wenn Ihr Modul sehr klein ist oder kontextabhängig ist.
Um das Verzeichnis auf 2 Ebenen aufzurufen:
import os.path as path
two_up = path.abspath(path.join(os.getcwd(),"../.."))
Ich persönlich finde, dass die Verwendung des os-Moduls die unten beschriebene einfachste Methode ist. Wenn Sie nur eine Ebene höher gehen, ersetzen Sie ('../ ..') durch ('..').
import os
os.chdir('../..')
--Check:
os.getcwd()
Ich habe festgestellt, dass das folgende in 2.7.x gut funktioniert
import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
Die beste Lösung (für Python> = 3.4) bei der Ausführung von einem beliebigen Verzeichnis aus ist:
from pathlib import Path
two_up = Path(__file__).resolve().parents[1]
Weitere plattformübergreifende Implementierung wird sein:
import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
Die Verwendung von parent
wird unter Windows nicht unterstützt. Sie müssen auch .resolve()
hinzufügen:
Machen Sie den Pfad absolut, indem Sie alle Symlinks auf dem Weg auflösen und auch normalisieren (z. B. Schrägstriche in Backslashes unter Windows umwandeln)
Sie können dies als generische Lösung verwenden:
import os
def getParentDir(path, level=1):
return os.path.normpath( os.path.join(path, *([".."] * level)) )