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?

Flocke
quelle

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__))
Sven Marnach
quelle
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
9

kann auch so verwendet werden:

dirname(dirname(abspath(__file__)))
Adnan Dogar
quelle
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

RY Zheng
quelle
6
import os.path

dirname = os.path.dirname(__file__) or '.'
Deve
quelle
5
print(os.path.join(os.path.dirname(__file__))) 

Sie können diesen Weg auch verwenden

Mikhail
quelle