os.path.dirname (__ file__) gibt leer zurück


164

Ich möchte den Pfad des aktuellen Verzeichnisses abrufen, unter dem eine .py-Datei ausgeführt wird.

Zum Beispiel eine einfache Datei D:\test.pymit Code:

import os

print os.getcwd()
print os.path.basename(__file__)
print os.path.abspath(__file__)
print os.path.dirname(__file__)

Es ist seltsam, dass die Ausgabe ist:

D:\
test.py
D:\test.py
EMPTY

Ich erwarte die gleichen Ergebnisse von der getcwd()und path.dirname().

Gegeben os.path.abspath = os.path.dirname + os.path.basename, warum

os.path.dirname(__file__)

kehrt leer zurück?

Antworten:


255

Weil os.path.abspath = os.path.dirname + os.path.basenamenicht hält. wir haben lieber

os.path.dirname(filename) + os.path.basename(filename) == filename

Beide dirname()und basename()teilen nur den übergebenen Dateinamen in Komponenten auf, ohne das aktuelle Verzeichnis zu berücksichtigen. Wenn Sie auch das aktuelle Verzeichnis berücksichtigen möchten, müssen Sie dies explizit tun.

Verwenden Sie, um den Verzeichnisnamen des absoluten Pfads abzurufen

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

3
Hallo Sven, Sie haben Recht, es sollte os.path.dirname (os.path.abspath ( Datei )) sein. Vielen Dank! Nur zu Ihrer Information, Sie erhalten einen kleinen Tippfehler in der letzten Zeile.
Flake

11
Beachten Sie, dass der obige Kommentar fett gedruckt ist und aufgrund der Markdown-Formatierung auf beiden Seiten unterstrichen werden sollte. Die ursprüngliche Antwort wurde korrekt geändert
Watsonic

1
Beachten Sie, dass wir nie haben, os.path.dirname(filename) + os.path.basename(filename) == filenameweil das Verzeichnis-Trennzeichen fehlt. Wir haben eher:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Jean Paul

Ich bin verwirrt, sollten Sie basedir = os.path.abspath (os.path.dirname ( Datei )) in Ihrem Programm belassen ? oder was ersetzen Sie oder wo ersetzen Sie Ihren Pfad wie C: \ Users \ Test \ app.db?
0004

@ pes04 wird __file__auf den Namen der aktuellen Datei erweitert, sodass Sie eine wörtliche Kopie des Codes aus dieser Antwort verwenden können.
Sven Marnach


6
os.path.split(os.path.realpath(__file__))[0]

os.path.realpath(__file__)Geben Sie den Abspath des aktuellen Skripts zurück. os.path.split (abspath) [0] gibt das aktuelle Verzeichnis zurück


6
import os.path

dirname = os.path.dirname(__file__) or '.'

5
print(os.path.join(os.path.dirname(__file__))) 

Sie können diesen Weg auch verwenden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.