Python-Exit-Befehle - warum so viele und wann sollte jeder verwendet werden?

489

Es scheint, dass Python viele verschiedene Befehle unterstützt, um die Skriptausführung zu stoppen.
Die Entscheidungen , die ich gefunden habe , sind: quit(), exit(), sys.exit(),os._exit()

Habe ich welche verpasst? Was ist der Unterschied zwischen ihnen? Wann würden Sie jeden verwenden?

Jonathan
quelle
1
Sie haben verpasstos.abort()
The Daleks

Antworten:

765

Lassen Sie mich einige Informationen dazu geben:

  1. quit()löst einfach die SystemExitAusnahme aus.

    Wenn Sie es ausdrucken, wird außerdem eine Meldung angezeigt:

    >>> print (quit)
    Use quit() or Ctrl-Z plus Return to exit
    >>>
    

    Diese Funktionalität wurde hinzugefügt, um Personen zu helfen, die Python nicht kennen. Schließlich ist eines der wahrscheinlichsten Dinge, die ein Neuling versuchen wird, Python zu beenden, das Eingeben quit.

    Sollte quitjedoch nicht im Produktionscode verwendet werden. Dies liegt daran, dass es nur funktioniert, wenn das siteModul geladen ist. Stattdessen sollte diese Funktion nur im Interpreter verwendet werden.

  2. exit()ist ein Alias ​​für quit(oder umgekehrt). Sie existieren einfach zusammen, um Python benutzerfreundlicher zu machen.

    Außerdem gibt es beim Drucken eine Meldung:

    >>> print (exit)
    Use exit() or Ctrl-Z plus Return to exit
    >>>
    

    Doch wie quit, exitwird als schlecht in der Produktion Code zu verwenden und soll für die Verwendung im Interpreter reserviert werden. Dies liegt daran, dass es auch auf das siteModul angewiesen ist .

  3. sys.exit()löst auch die SystemExitAusnahme aus. Dies bedeutet , dass es die gleichen wie ist quitund exitin dieser Hinsicht.

    Im Gegensatz zu diesen beiden wird es jedoch sys.exitals gut für die Verwendung im Produktionscode angesehen. Dies liegt daran, dass das sysModul immer da ist.

  4. os._exit()beendet das Programm ohne Bereinigung Handler aufrufen, stdio Puffer Spülung, etc . Daher ist es keine Standardmethode zum Beenden und sollte nur in besonderen Fällen verwendet werden. Die häufigste davon sind die untergeordneten Prozesse, die von erstellt wurden os.fork.

    Beachten Sie, dass von den vier angegebenen Methoden nur diese in ihrer Funktionsweise einzigartig ist.

Zusammenfassend beenden alle vier Methoden das Programm. Die ersten beiden werden jedoch als schlecht für die Verwendung im Produktionscode angesehen, und die letzte ist eine nicht standardmäßige, schmutzige Methode, die nur in speziellen Szenarien verwendet wird. Wenn Sie ein Programm normal beenden möchten, wählen Sie die dritte Methode : sys.exit.


Oder, meiner Meinung nach noch besser, Sie können einfach direkt das tun, was sys.exithinter den Kulissen passiert, und rennen:

raise SystemExit

Auf diese Weise müssen Sie nicht syszuerst importieren .

Diese Wahl hängt jedoch nur vom Stil ab und liegt ganz bei Ihnen.

mhsmith
quelle
2
Aber in der Ipython-Shell quitund exitbeenden Sie die Shell, während sys.exitdies nicht der Fall ist.
Lee
5
sys.exit()ist kein zuverlässiger Weg, um zu schließen. Wenn es innerhalb eines Threads aufgerufen wird, wird nur dieser Thread beendet, es sei denn, er befindet sich im Hauptthread. Dies kann zu vielen Fällen führen, in denen das Programm fortgesetzt wird, weil sich der Aufruf nicht im Hauptthread befand, insbesondere da einige Interpreter unsichtbar Thread-Aufrufe ausführen.
Elliot
1
Ich stimme dafür, einen endBefehl hinzuzufügen, der dies tun würde raise SystemExit. Verstehe nicht, warum es so etwas nicht einfach geben kann, wie in BASIC.
Brian Burns
6
@BrianBurns: Es lohnt sich nicht, eine dedizierte Syntax hinzuzufügen und ein anderes Schlüsselwort zu reservieren. Dies ähnelt dem Grund, warum printvon einer Anweisung in eine Funktion geändert wurde. Es ist einfach, Syntax hinzuzufügen, aber dies ist mit Komplexitätskosten verbunden.
user2357112 unterstützt Monica
1
Sind die Klammern beim Aufrufen wichtig sys.exit()?
Lindhe
100

Die Funktionen * quit() ,, exit()und sys.exit()funktionieren auf die gleiche Weise: Sie lösen die SystemExitAusnahme aus. So gibt es keinen wirklichen Unterschied, außer dass sys.exit()immer verfügbar ist , aber exit()und quit()stehen nur zur Verfügung , wenn das siteModul importiert wird.

Die os._exit()Funktion ist etwas Besonderes. Sie wird sofort beendet, ohne dass Bereinigungsfunktionen aufgerufen werden (z. B. werden keine Puffer geleert). Dies ist für hochspezialisierte Anwendungsfälle konzipiert ... grundsätzlich nur beim Kind nach einem os.fork()Anruf.

Fazit

  • Verwenden Sie exit()oder quit()in der REPL.

  • Verwenden Sie sys.exit()in Skripten oder raise SystemExit()wenn Sie es vorziehen.

  • Verwenden Sie diese Option, os._exit()damit untergeordnete Prozesse nach einem Aufruf von beendet werden os.fork().

All dies kann ohne Argumente aufgerufen werden, oder Sie können den Exit-Status angeben, z. B. exit(1)oder raise SystemExit(1)mit Status 1 beenden. Beachten Sie, dass tragbare Programme auf Exit-Statuscodes im Bereich von 0 bis 255 beschränkt sind, wenn Sie dies raise SystemExit(256)auf vielen Systemen tun wird abgeschnitten und Ihr Prozess wird tatsächlich mit dem Status 0 beendet.

Fußnoten

* Eigentlich quit()und exit()sind aufrufbare Instanzobjekte, aber ich denke, es ist in Ordnung, sie Funktionen aufzurufen.

Dietrich Epp
quelle
50

Verschiedene Mittel zum Verlassen

os._exit()::

  • Beenden Sie den Prozess, ohne die Bereinigungshandler aufzurufen.

exit(0)::

  • ein sauberer Ausgang ohne Fehler / Probleme.

exit(1)::

  • Es gab ein Problem / einen Fehler / ein Problem und deshalb wird das Programm beendet.

sys.exit()::

  • Wenn das System und Python heruntergefahren werden; Dies bedeutet, dass nach dem Ausführen des Programms weniger Speicher verwendet wird.

quit()::

  • Schließt die Python-Datei.

Zusammenfassung

Grundsätzlich machen sie alle dasselbe, aber es hängt auch davon ab, wofür Sie es tun.

Ich glaube nicht, dass Sie etwas ausgelassen haben und ich würde empfehlen, sich an quit()oder zu gewöhnen exit().

Sie würden verwenden sys.exit()und os._exit()hauptsächlich, wenn Sie große Dateien verwenden oder Python zur Steuerung des Terminals verwenden.

Ansonsten hauptsächlich exit()oder verwenden quit().

Mike Williamson
quelle
42

sys.exit ist der kanonische Weg zum Verlassen.

Intern sys.exiterhöht nur SystemExit. Das Anrufen sys.exitist jedoch idiomatischer als das SystemExitdirekte Erhöhen .

os.exit ist ein Systemaufruf auf niedriger Ebene, der direkt beendet wird, ohne Bereinigungshandler aufzurufen.

quitund exitexistieren nur, um einen einfachen Ausweg aus der Python-Eingabeaufforderung zu bieten. Dies ist für neue Benutzer oder Benutzer gedacht, die versehentlich die Python-Eingabeaufforderung eingegeben haben und nicht die richtige Syntax kennen möchten. Sie werden wahrscheinlich versuchen, exitoder quit. Dies beendet den Interpreter zwar nicht, gibt jedoch zumindest eine Nachricht aus, die ihm einen Ausweg aufzeigt:

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$

Dies ist im Wesentlichen nur ein Hack, der die Tatsache ausnutzt, dass der Interpreter den __repr__Ausdruck druckt, den Sie an der Eingabeaufforderung eingeben.

oefe
quelle