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?

Jonathan
źródło
1
Przegapiłeśos.abort()
The Daleks

Odpowiedzi:

764

Pozwól, że podam kilka informacji na ich temat:

  1. quit()po prostu podnosi SystemExitwyjątek.

    Ponadto, jeśli go wydrukujesz, wyświetli się komunikat:

    >>> print (quit)
    Use quit() or Ctrl-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

  2. 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() or Ctrl-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.

  3. 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.

  4. 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ć:

raise SystemExit

W ten sposób nie musisz sysnajpierw importować .

Jednak ten wybór jest po prostu stylowy i zależy wyłącznie od Ciebie.

mhmsmith
źródło
2
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.

Dietrich Epp
źródło
50

Różne sposoby wyjścia

os._exit():

  • Wyjdź z procesu bez wywoływania procedur czyszczących.

exit(0):

  • czyste wyjście bez żadnych błędów / problemów.

exit(1):

  • Wystąpił problem / błąd / problem i dlatego program się kończy.

sys.exit():

  • Kiedy system i python wyłączają się; oznacza to, że po uruchomieniu programu zużywa się mniej pamięci.

quit():

  • Zamyka plik python.

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()lub exit().

Należałoby użyć sys.exit(), a os._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()lub quit().

Mike Williamson
źródło
42

sys.exit jest kanonicznym sposobem na wyjście.

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() or Ctrl-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.

oefe
źródło