os.path.dirname (__ plik__) zwraca pusty

165

Chcę uzyskać ścieżkę do bieżącego katalogu, w którym jest wykonywany plik .py.

Na przykład prosty plik D:\test.pyz kodem:

import os

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

To dziwne, że wynik to:

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

Oczekuję tych samych wyników z getcwd()i path.dirname().

Biorąc pod uwagę os.path.abspath = os.path.dirname + os.path.basename, dlaczego

os.path.dirname(__file__)

zwraca puste?

Płatek
źródło

Odpowiedzi:

257

Ponieważ os.path.abspath = os.path.dirname + os.path.basenamenie wytrzymuje. raczej mamy

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

Oba dirname()i basename()tylko dzielą przekazaną nazwę pliku na komponenty bez uwzględniania bieżącego katalogu. Jeśli chcesz wziąć pod uwagę również bieżący katalog, musisz to zrobić jawnie.

Aby uzyskać nazwę katalogu ścieżki bezwzględnej, użyj

os.path.dirname(os.path.abspath(__file__))
Sven Marnach
źródło
3
Cześć Sven, masz rację, powinien to być os.path.dirname (os.path.abspath ( plik )). Dzięki! Do Twojej wiadomości, w ostatnim wierszu pojawiła się mała literówka.
Flake
11
Zwróć uwagę, że powyższy komentarz jest pogrubiony, gdzie powinno być podkreślone po obu stronach z powodu formatowania przecen. oryginalna odpowiedź została zmieniona poprawnie
watsonic
1
Zauważ, że nigdy nie mieliśmy, os.path.dirname(filename) + os.path.basename(filename) == filenameponieważ brakuje separatora katalogów. Raczej mamy:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Jean Paul
Jestem zdezorientowany, czy w programie należy pozostawić baseir = os.path.abspath (os.path.dirname ( plik ))? lub co zastępujesz lub gdzie zastępujesz ścieżkę, taką jak C: \ Users \ Test \ app.db?
0004
@ pes04 __file__rozwija się do nazwy bieżącego pliku, więc możesz użyć dosłownej kopii kodu z tej odpowiedzi.
Sven Marnach
9

można również użyć w ten sposób:

dirname(dirname(abspath(__file__)))
adnan dogar
źródło
7
import os.path

dirname = os.path.dirname(__file__) or '.'
Deve
źródło
6
os.path.split(os.path.realpath(__file__))[0]

os.path.realpath(__file__)zwraca abspath bieżącego skryptu; os.path.split (abspath) [0] zwraca bieżący katalog

RY Zheng
źródło
5
print(os.path.join(os.path.dirname(__file__))) 

Możesz także użyć w ten sposób

Michaił
źródło