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?

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__))

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


7
import os.path

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

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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.