Do czego służy __main__.py
plik, jaki kod powinienem w nim umieścić i kiedy powinienem go mieć?
Często program w języku Python jest uruchamiany przez nazwanie pliku .py w wierszu polecenia:
$ python my_program.py
Możesz także utworzyć katalog lub plik zip pełen kodu i dołączyć __main__.py
. Następnie możesz po prostu nazwać katalog lub plik zip w wierszu poleceń, a program wykona __main__.py
automatycznie:
$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program
Musisz sam zdecydować, czy Twoja aplikacja może skorzystać z takiego wykonania.
Zauważ, że __main__
moduł zwykle nie pochodzi z __main__.py
pliku. Może, ale zwykle nie. Po uruchomieniu takiego skryptu python my_program.py
skrypt będzie działał jako __main__
moduł zamiast my_program
modułu. Dzieje się tak również w przypadku modułów uruchamianych jako python -m my_module
lub na kilka innych sposobów.
Jeśli zobaczyłeś nazwę __main__
w komunikacie o błędzie, nie musi to oznaczać, że powinieneś szukać __main__.py
pliku.
python -m program_dir
ipython program_dir
trochę inaczej: ten ostatni nigdy nie działa__init__.py
w katalogu (jeśli taki istnieje).python3 program_dir
i zadziałało__init__.py
.python3 dir
działa,__main__.py
ale nie__init__.py
, podczas gdypython3 -m dir
działa oba.__main__.py
którym uruchomiono import__init__.py
Do czego służy
__main__.py
plik?Podczas tworzenia modułu w języku Python, moduł często wykonuje pewną funkcjonalność (zwykle zawartą w
main
funkcji), gdy jest uruchamiany jako punkt wejścia programu. Zwykle odbywa się to za pomocą następującego wspólnego idiomu umieszczonego na dole większości plików Pythona:Możesz uzyskać tę samą semantykę dla pakietu Python z
__main__.py
. To jest monit powłoki Linuksa$
, jeśli nie masz Bash (lub innej powłoki Posix) w systemie Windows, po prostu utwórz te plikidemo/__<init/main>__.py
z zawartością pomiędzyEOF
s:(W powłoce Posix / Bash możesz zrobić powyższe bez
<< EOF
s i kończąc naEOF
s, wpisując Ctrl+ D, znak końca pliku na końcu każdej komendy cat)I teraz:
Możesz to wywnioskować z dokumentacji. Dokumentacja mówi:
Zapinane na zamek
Możesz także spakować to do jednego pliku i uruchomić z wiersza poleceń w ten sposób - ale pamiętaj, że spakowane pakiety nie mogą wykonywać podpakietów lub podmodułów jako punktu wejścia:
źródło
__main__.py
jest używany w programach Python w plikach zip.__main__.py
Plik zostanie wykonany, gdy plik zip w uruchomieniu. Na przykład, jeśli plik zip był taki:i treść
__main__.py
byłaGdybyśmy mieli biec
python test.zip world
, ucieklibyśmyhello world
.Tak więc
__main__.py
plik jest uruchamiany, gdy python jest wywoływany w pliku zip.źródło
Tworzysz
__main__.py
w,yourpackage
aby był wykonywalny jako:źródło
-m
działa, jeśli tylko program jest dostępny jako moduł, w przeciwnym razie możesz użyćpython <yourpackage>
UWAGA: bez-m
opcjipackage
?python -m <yourproject>
nie działa,-m
jest opcją redundantną, alepython <yourpackage>
działa dobrze.a
i zakładanie skryptua/b/c/__main__.py
...python -m b.c
zostanie wykonane z katalogu,a
a import skryptu głównego będzie względnya
. Alepython b/c
wykona się z zakresu importu katalogu,c
więc jakikolwiek import jak w skrypcie głównym jakimport b.d
nie powiedzie się.Jeśli skrypt jest katalogiem lub plikiem ZIP, a nie pojedynczym plikiem Pythona,
__main__.py
zostanie wykonany, gdy „skrypt” zostanie przekazany jako argument do interpretera Pythona.źródło