Gdy moduł jest ładowany z pliku w Pythonie, __file__
ustawiany jest na jego ścieżkę. Możesz następnie użyć tego z innymi funkcjami, aby znaleźć katalog, w którym znajduje się plik.
Biorąc swoje przykłady pojedynczo:
A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.
B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.
C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.
Możesz zobaczyć różne wartości zwrócone z tych tutaj:
import os
print(__file__)
print(os.path.join(os.path.dirname(__file__), '..'))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.abspath(os.path.dirname(__file__)))
i upewnij się, uruchomić go z różnych miejsc (takich jak ./text.py
, ~/python/text.py
i tak dalej), aby zobaczyć, co sprawia, że różnica.
__file__
NIE jest zdefiniowany we wszystkich przypadkach, np. Statycznie połączone moduły C. Nie możemy liczyć na__file__
to, że zawsze będziemy dostępni.name '__file__' is not defined
.__file__
to ścieżka do pliku, z którego został załadowany moduł, jeśli został załadowany z pliku. Oznacza to, że__file__
będzie działać tylko wtedy, gdy uruchomisz go jako skrypt, a nie w tłumaczu. (Chyba że zaimportujesz go do interpretera ...)Chcę tylko najpierw zająć się pewnym zamieszaniem.
__file__
nie jest symbolem wieloznacznym, jest atrybutem. Atrybuty i metody podwójnego podkreślenia są na mocy konwencji uważane za „specjalne” i służą specjalnemu celowi.http://docs.python.org/reference/datamodel.html zawiera wiele specjalnych metod i atrybutów, jeśli nie wszystkie.
W tym przypadku
__file__
jest to atrybut modułu (obiekt modułu). W Pythonie.py
plik jest modułem. Więcimport amodule
będzie miał atrybut,__file__
który oznacza różne rzeczy w różnych okolicznościach.Zaczerpnięte z dokumentów:
W twoim przypadku moduł uzyskuje dostęp do swojego własnego
__file__
atrybutu w globalnej przestrzeni nazw.Aby zobaczyć to w akcji, spróbuj:
I biegnij:
źródło
Zgodnie z dokumentacją :
a także :
źródło
Użycie w
__file__
połączeniu z różnymios.path
modułami pozwala, aby wszystkie ścieżki były względne względem lokalizacji katalogu bieżącego modułu. Pozwala to na przenoszenie Twoich modułów / projektów na inne maszyny.W swoim projekcie robisz:
a następnie spróbuj wdrożyć go na serwerze za pomocą katalogu wdrożeń, takiego jak
/home/web/mydevproject/
wtedy, gdy kod nie będzie w stanie poprawnie znaleźć ścieżek.źródło