Polecenia wyjścia w Pythonie - dlaczego tak wiele i kiedy należy z nich korzystać?
489
Wygląda na to, że Python obsługuje wiele różnych poleceń, aby zatrzymać wykonywanie skryptu. Wybory znalazłem to: quit(), exit(), sys.exit(),os._exit()
Czy coś przegapiłem? Jaka jest różnica między nimi? Kiedy z nich skorzystasz?
Ponadto, jeśli go wydrukujesz, wyświetli się komunikat:
>>>print(quit)Use quit()orCtrl-Z plus Return to exit
>>>
Ta funkcja została włączona, aby pomóc osobom, które nie znają Pythona. W końcu jedną z najbardziej prawdopodobnych rzeczy, które nowicjusz spróbuje zamknąć, jest pisanie w Pythonie quit.
Niemniej jednak niequit należy go używać w kodzie produkcyjnym. Jest tak, ponieważ działa tylko wtedy, gdy moduł jest załadowany. Zamiast tego tej funkcji należy używać tylko w tłumaczu.site
exit()jest aliasem dla quit(lub odwrotnie). Istnieją razem, aby Python był bardziej przyjazny dla użytkownika.
Ponadto po wydrukowaniu wyświetla komunikat:
>>>print(exit)Use exit()orCtrl-Z plus Return to exit
>>>
Jednak, podobnie jak quit, exitjest uważany za zły do użycia w kodzie produkcyjnym i powinien być zarezerwowany do użycia w tłumaczu. Wynika to z faktu, że również zależy od sitemodułu.
sys.exit()podnosi również SystemExitwyjątek. Oznacza to, że jest to to samo quiti exitpod tym względem.
Jednak w przeciwieństwie do tych dwóch, sys.exitjest uważany za dobry do użycia w kodzie produkcyjnym. Dzieje się tak, ponieważ sysmoduł zawsze tam będzie.
os._exit()wychodzi z programu bez wywoływania procedur czyszczących, opróżniania buforów stdio itp . Dlatego nie jest to standardowy sposób na wyjście i powinien być używany tylko w szczególnych przypadkach. Najczęstszym z nich jest proces potomny utworzony przez os.fork.
Zauważ, że spośród czterech podanych metod tylko ta jest wyjątkowa w tym, co robi.
Podsumowując, wszystkie cztery metody wychodzą z programu. Jednak pierwsze dwa są uważane za nieodpowiednie do użycia w kodzie produkcyjnym, a ostatni to niestandardowy, brudny sposób, który jest używany tylko w specjalnych scenariuszach. Tak więc, jeśli chcesz wyjść z programu normalnie, iść z trzeciej metody: sys.exit.
Lub, moim zdaniem, jeszcze lepiej, możesz po prostu zrobić bezpośrednio to, co sys.exitdzieje się za kulisami i uruchomić:
raiseSystemExit
W ten sposób nie musisz sysnajpierw importować .
Jednak ten wybór jest po prostu stylowy i zależy wyłącznie od Ciebie.
Ale w powłoce ipython quiti opuść powłokę, exitdopóki sys.exittego nie zrobisz .
Lee
5
sys.exit()nie jest niezawodnym sposobem zamknięcia. Jeśli zostanie wywołany w wątku, zakończy tylko ten wątek, chyba że znajduje się w wątku głównym. Może to prowadzić do wielu przypadków, w których program jest kontynuowany, ponieważ wywołanie nie było w głównym wątku, zwłaszcza że niektórzy tłumacze niewidzialnie nawiążą połączenia.
Elliot
1
Głosuję za dodaniem endpolecenia, które by to zrobiło raise SystemExit. Nie rozumiem, dlaczego nie może być czegoś tak prostego, jak w języku BASIC.
Brian Burns
6
@BrianBurns: Nie warto dodawać dedykowanej składni i rezerwować inne słowo kluczowe. Jest to podobne do tego, dlaczego printzmieniono z instrukcji na funkcję. Łatwo jest dodać składnię, ale jest to kosztem złożoności.
user2357112 obsługuje Monica
1
Czy nawiasy są ważne podczas dzwonienia sys.exit()?
lindhe
99
Funkcje *quit() , exit()i sys.exit()działają w ten sam sposób: zgłaszają SystemExitwyjątek. Więc nie ma istotnej różnicy, poza tym, że sys.exit()jest zawsze dostępny, ale exit()i quit()są dostępne tylko wtedy, gdy sitemoduł jest importowany.
Ta os._exit()funkcja jest wyjątkowa, wychodzi natychmiast bez wywoływania funkcji czyszczenia (na przykład nie opróżnia buforów). Jest to przeznaczone do wysoce wyspecjalizowanych zastosowań ... w zasadzie tylko u dziecka po os.fork()rozmowie telefonicznej.
Wniosek
Użyj exit()lub quit()w REPL.
Użyj sys.exit()w skryptach lub raise SystemExit()jeśli wolisz.
Posługiwać się os._exit() dla procesów potomnych, aby wyjść po wywołaniu do os.fork().
Wszystkie z nich można wywoływać bez argumentów lub można określić status wyjścia, np. exit(1)Lub raise SystemExit(1)wyjść ze statusem 1. Uwaga: programy przenośne są ograniczone do kodów statusu wyjścia w zakresie 0–255, jeśli raise SystemExit(256)w wielu systemach będzie to zostanie obcięty, a proces zakończy się ze statusem 0.
Przypisy
* Właściwie, quit()i exit()są płatne na żądanie obiekty przykład, ale myślę, że to w porządku, aby nazwać ich funkcje.
Wewnętrznie sys.exitpo prostu podnosi SystemExit. Jednak sprawdzanie sys.exitjest bardziej idiomatyczne niż SystemExitbezpośrednie przebijanie .
os.exit to niskopoziomowe wywołanie systemowe, które kończy się bezpośrednio bez wywoływania żadnych procedur czyszczących.
quiti exitistnieją tylko po to, aby zapewnić łatwe wyjście z pytania w Pythonie. Dotyczy to nowych użytkowników lub użytkowników, którzy przypadkowo wprowadzili monit w Pythonie i nie chcą znać właściwej składni. Prawdopodobnie spróbują pisać na klawiaturze exitlub quit. Chociaż to nie wyjdzie z interpretera, przynajmniej wydaje komunikat, który mówi im o wyjściu:
>>> exit
Use exit()orCtrl-D (i.e. EOF) to exit
>>> exit()
$
Jest to w zasadzie tylko hack wykorzystujący fakt, że interpreter wypisuje __repr__dowolne wyrażenie, które wpiszesz w monicie.
os.abort()
Odpowiedzi:
Pozwól, że podam kilka informacji na ich temat:
quit()
po prostu podnosiSystemExit
wyjątek.Ponadto, jeśli go wydrukujesz, wyświetli się komunikat:
Ta funkcja została włączona, aby pomóc osobom, które nie znają Pythona. W końcu jedną z najbardziej prawdopodobnych rzeczy, które nowicjusz spróbuje zamknąć, jest pisanie w Pythonie
quit
.Niemniej jednak nie
quit
należy go używać w kodzie produkcyjnym. Jest tak, ponieważ działa tylko wtedy, gdy moduł jest załadowany. Zamiast tego tej funkcji należy używać tylko w tłumaczu.site
exit()
jest aliasem dlaquit
(lub odwrotnie). Istnieją razem, aby Python był bardziej przyjazny dla użytkownika.Ponadto po wydrukowaniu wyświetla komunikat:
Jednak, podobnie jak
quit
,exit
jest uważany za zły do użycia w kodzie produkcyjnym i powinien być zarezerwowany do użycia w tłumaczu. Wynika to z faktu, że również zależy odsite
modułu.sys.exit()
podnosi równieżSystemExit
wyjątek. Oznacza to, że jest to to samoquit
iexit
pod tym względem.Jednak w przeciwieństwie do tych dwóch,
sys.exit
jest uważany za dobry do użycia w kodzie produkcyjnym. Dzieje się tak, ponieważsys
moduł zawsze tam będzie.os._exit()
wychodzi z programu bez wywoływania procedur czyszczących, opróżniania buforów stdio itp . Dlatego nie jest to standardowy sposób na wyjście i powinien być używany tylko w szczególnych przypadkach. Najczęstszym z nich jest proces potomny utworzony przezos.fork
.Zauważ, że spośród czterech podanych metod tylko ta jest wyjątkowa w tym, co robi.
Podsumowując, wszystkie cztery metody wychodzą z programu. Jednak pierwsze dwa są uważane za nieodpowiednie do użycia w kodzie produkcyjnym, a ostatni to niestandardowy, brudny sposób, który jest używany tylko w specjalnych scenariuszach. Tak więc, jeśli chcesz wyjść z programu normalnie, iść z trzeciej metody:
sys.exit
.Lub, moim zdaniem, jeszcze lepiej, możesz po prostu zrobić bezpośrednio to, co
sys.exit
dzieje się za kulisami i uruchomić:W ten sposób nie musisz
sys
najpierw importować .Jednak ten wybór jest po prostu stylowy i zależy wyłącznie od Ciebie.
źródło
quit
i opuść powłokę,exit
dopókisys.exit
tego nie zrobisz .sys.exit()
nie jest niezawodnym sposobem zamknięcia. Jeśli zostanie wywołany w wątku, zakończy tylko ten wątek, chyba że znajduje się w wątku głównym. Może to prowadzić do wielu przypadków, w których program jest kontynuowany, ponieważ wywołanie nie było w głównym wątku, zwłaszcza że niektórzy tłumacze niewidzialnie nawiążą połączenia.end
polecenia, które by to zrobiłoraise SystemExit
. Nie rozumiem, dlaczego nie może być czegoś tak prostego, jak w języku BASIC.print
zmieniono z instrukcji na funkcję. Łatwo jest dodać składnię, ale jest to kosztem złożoności.sys.exit()
?Funkcje *
quit()
,exit()
isys.exit()
działają w ten sam sposób: zgłaszająSystemExit
wyjątek. Więc nie ma istotnej różnicy, poza tym, żesys.exit()
jest zawsze dostępny, aleexit()
iquit()
są dostępne tylko wtedy, gdysite
moduł jest importowany.Ta
os._exit()
funkcja jest wyjątkowa, wychodzi natychmiast bez wywoływania funkcji czyszczenia (na przykład nie opróżnia buforów). Jest to przeznaczone do wysoce wyspecjalizowanych zastosowań ... w zasadzie tylko u dziecka poos.fork()
rozmowie telefonicznej.Wniosek
Użyj
exit()
lubquit()
w REPL.Użyj
sys.exit()
w skryptach lubraise SystemExit()
jeśli wolisz.Posługiwać się
os._exit()
dla procesów potomnych, aby wyjść po wywołaniu doos.fork()
.Wszystkie z nich można wywoływać bez argumentów lub można określić status wyjścia, np.
exit(1)
Lubraise SystemExit(1)
wyjść ze statusem 1. Uwaga: programy przenośne są ograniczone do kodów statusu wyjścia w zakresie 0–255, jeśliraise SystemExit(256)
w wielu systemach będzie to zostanie obcięty, a proces zakończy się ze statusem 0.Przypisy
* Właściwie,
quit()
iexit()
są płatne na żądanie obiekty przykład, ale myślę, że to w porządku, aby nazwać ich funkcje.źródło
Różne sposoby wyjścia
os._exit()
:exit(0)
:exit(1)
:sys.exit()
:quit()
:Podsumowanie
Zasadniczo wszyscy robią to samo, jednak zależy to również od tego, po co to robisz.
Nie sądzę, żebyś coś pomijał i zalecałbym przyzwyczajenie się do
quit()
lubexit()
.Należałoby użyć
sys.exit()
, aos._exit()
przede wszystkim, jeśli używasz dużych plików lub używasz Pythona kontrolować terminalu.W przeciwnym razie użyj głównie
exit()
lubquit()
.źródło
sys.exit
jest kanonicznym sposobem na wyjście.Wewnętrznie
sys.exit
po prostu podnosiSystemExit
. Jednak sprawdzaniesys.exit
jest bardziej idiomatyczne niżSystemExit
bezpośrednie przebijanie .os.exit
to niskopoziomowe wywołanie systemowe, które kończy się bezpośrednio bez wywoływania żadnych procedur czyszczących.quit
iexit
istnieją tylko po to, aby zapewnić łatwe wyjście z pytania w Pythonie. Dotyczy to nowych użytkowników lub użytkowników, którzy przypadkowo wprowadzili monit w Pythonie i nie chcą znać właściwej składni. Prawdopodobnie spróbują pisać na klawiaturzeexit
lubquit
. Chociaż to nie wyjdzie z interpretera, przynajmniej wydaje komunikat, który mówi im o wyjściu:Jest to w zasadzie tylko hack wykorzystujący fakt, że interpreter wypisuje
__repr__
dowolne wyrażenie, które wpiszesz w monicie.źródło