HOWTO
Wie Sie das aktuelle Skript-Dateiverzeichnis in Python erhalten
Es gibt das Codebeispiel, wie man den Pfad der aktuellen Skriptdatei erhält
Auf dieser Seite
Um das Verzeichnis zu ermitteln, in dem ein laufendes Python-Skript liegt, verwenden Sie os.path.dirname(os.path.abspath(__file__)) oder Path(__file__).resolve().parent. Beide Ausdrücke beginnen mit __file__, dem Pfad, der dem Skript zugeordnet ist, und ermitteln das Verzeichnis, in dem es liegt. Verwenden Sie dieses Verzeichnis, um Pfade zu Dateien neben dem Skript zusammenzusetzen.
Das Verzeichnis des aktuellen Skripts ermitteln
Das Verzeichnis eines Skripts ist der Ordner, der seine .py-Datei enthält. __file__ gibt den Skriptpfad an; mit os.path.abspath() und anschließend os.path.dirname() erhalten Sie einen absoluten Verzeichnispfad. Das ist nützlich, wenn ein Skript eine benachbarte Konfigurations-, Eingabe- oder Datendatei benötigt. Ist __file__ relativ, löst os.path.abspath() den Pfad anhand des Arbeitsverzeichnisses des Prozesses auf. Das Ergebnis kann daher davon abhängen, von wo aus Python gestartet wurde. Ist __file__ bereits absolut, bestimmt dieses Arbeitsverzeichnis den Speicherort nicht.
Führen Sie dieses Beispiel in einer gespeicherten Python-Datei aus. Die im Code ausgegebenen Bezeichnungen bleiben Englisch:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import os
script_path = os.path.abspath(__file__)
script_directory = os.path.dirname(script_path)
directory, filename = os.path.split(script_path)
print("Script directory:", script_directory)
print("Directory and filename:", directory, filename)
Script directory: /work
Directory and filename: /work case-0.py
os.path.abspath() macht den Skriptpfad anhand des aktuellen Prozesskontexts absolut, und os.path.dirname() ermittelt den Verzeichnisanteil. os.path.split() gibt Verzeichnis und Dateiname als getrennte Werte zurück. Das ausgegebene Verzeichnis hängt davon ab, wo Sie die Datei speichern; es gibt daher keine allgemeingültige wörtliche Ausgabe zum Kopieren.
Skriptverzeichnis und Arbeitsverzeichnis unterscheiden
Das Arbeitsverzeichnis ist der Prozessstandort, von dem aus relative Pfade wie open("data.csv") aufgelöst werden. Sie können es mit os.getcwd() prüfen. Es kann der aktuelle Ordner des Terminals, eine IDE-Einstellung oder ein von einem übergeordneten Prozess ausgewähltes Verzeichnis sein. Es ist nicht unbedingt der Ordner, der das Skript enthält.
__file__ bezeichnet dagegen den Pfad der ausgeführten Python-Datei. Wird ein Skript in /projects/tool gestartet, während das Arbeitsverzeichnis /tmp ist, wird ein relativer Aufruf von data.csv ausgehend von /tmp aufgelöst. Ein aus dem Skriptverzeichnis zusammengesetzter Pfad verweist dagegen auf /projects/tool. Wählen Sie den Ausgangspunkt passend zum vorgesehenen Speicherort der Datei. Für eine Datei neben dem Skript hängen Sie ihren Namen mit os.path.join(script_directory, "data.csv") an das ermittelte Skriptverzeichnis an.
Ein aus __file__ abgeleiteter absoluter Pfad garantiert weder, dass eine Datei existiert, noch löst er alle Fragen zu symbolischen Links oder zur Bereitstellung. Er bezeichnet einen Speicherort, den Sie als Ausgangspunkt verwenden können. Prüfen oder öffnen Sie den resultierenden Pfad entsprechend den Anforderungen Ihrer Anwendung.
Das Skriptverzeichnis mit os.path ermitteln
Das vorherige Beispiel behält die Zwischenergebnisse bei, damit jeder Schritt nachvollziehbar ist. Wenn Sie nur das Verzeichnis benötigen, kombinieren Sie die Aufrufe zu os.path.dirname(os.path.abspath(__file__)). Wenn beide Teile nützlich sind, behalten Sie das Ergebnis von os.path.split(), statt den Dateinamen zu verwerfen.
Um den Pfad zu einer benachbarten Datei zusammenzusetzen, verwenden Sie os.path.join() statt Zeichenketten mit einem Schrägstrich zu verbinden. So wendet Python die plattformspezifischen Regeln für Pfadtrenner an. Beispielsweise erstellt os.path.join(script_directory, "settings.json") einen Pfad, dessen Ausgangspunkt das Skriptverzeichnis ist. Ein relativer Dateiname, den Sie direkt an open() übergeben, wird dagegen vom Arbeitsverzeichnis aus aufgelöst.
Das Skriptverzeichnis mit pathlib ermitteln
Mit pathlib lässt sich derselbe Vorgang mithilfe von Pfadobjekten ausdrücken. In einem gespeicherten Skript ist Path(__file__).resolve().parent das Verzeichnis, in dem das Skript liegt: resolve() ermittelt einen absoluten, aufgelösten Pfad, und .parent wählt dessen übergeordneten Ordner aus. Mit / können Sie einen Unterpfad anhängen, zum Beispiel script_directory / "settings.json", und das resultierende Path-Objekt an APIs übergeben, die pfadähnliche Objekte akzeptieren, darunter open().
Der entsprechende Ausdruck lautet Path(__file__).resolve().parent; importieren Sie zuvor Path aus pathlib. Verwenden Sie vorzugsweise pathlib, wenn der umgebende Code bereits mit Path-Objekten arbeitet, und os.path, wenn Sie mit Zeichenkettenpfaden oder bestehenden APIs arbeiten, die solche erwarten. Keine der beiden Varianten ändert das Arbeitsverzeichnis des Prozesses.
Notebooks und andere Ausführungskontexte berücksichtigen
__file__ ist normalerweise definiert, wenn Python ein gespeichertes Skript ausführt. Interaktive Interpreter und Notebook-Kernel stellen diese Variable jedoch möglicherweise nicht bereit. In solchen Kontexten können die oben gezeigten skriptbasierten Ausdrücke den Pfad einer Notebook-Datei nicht auf portable Weise ermitteln. os.getcwd() gibt weiterhin das Arbeitsverzeichnis des Prozesses zurück. Das kann dabei helfen, Dateien relativ zum aktuellen Standort des Kernels zu finden, ersetzt aber nicht den Pfad zur Quelldatei eines Notebooks.
Wenn Sie den Pfad einer anderen Datei als der ausgeführten Skriptdatei benötigen, verwenden Sie deren bekannten Pfad statt __file__. Ermitteln Sie dann ihr Verzeichnis mit os.path.dirname() oder über .parent des Path-Objekts. Machen Sie die Pfadquelle ausdrücklich kenntlich, damit später klar ist, ob sie das Skript, eine andere Datei oder das Arbeitsverzeichnis des Prozesses bezeichnet.