683 Stimmen

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

Es scheint, dass Python viele verschiedene Befehle zur Beendigung der Skriptausführung unterstützt.
Die Optionen, die ich gefunden habe, sind: quit(), exit(), sys.exit(), os._exit()

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

977voto

Lassen Sie mich einige Informationen dazu geben:

  1. quit() löst einfach die Ausnahme SystemExit aus.

    Darüber hinaus gibt es beim Drucken eine Nachricht:

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

    Diese Funktionalität wurde eingeführt, um Menschen zu helfen, die kein Python kennen. Schließlich wird einer der wahrscheinlichsten Versuche eines Anfängers, Python zu beenden, das Eingeben von quit sein.

    Dennoch sollte quit nicht im Produktionscode verwendet werden. Dies liegt daran, dass es nur funktioniert, wenn das site-Modul geladen ist. Stattdessen sollte diese Funktion nur im Interpreter verwendet werden.

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

    Außerdem gibt es auch hier eine Nachricht beim Drucken:

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

    Wie quit gilt auch exit als unangemessen für die Verwendung im Produktionscode und sollte nur im Interpreter verwendet werden. Auch hier ist das site-Modul dafür erforderlich.

  3. sys.exit() löst ebenfalls die Ausnahme SystemExit aus. Das bedeutet, dass es in dieser Hinsicht das gleiche wie quit und exit ist.

    Im Gegensatz zu den beiden anderen gilt jedoch sys.exit als gut für die Verwendung im Produktionscode. Dies liegt daran, dass das sys-Modul immer vorhanden sein wird.

  4. os._exit() beendet das Programm ohne Aufruf von Bereinigungshandlern, Flushen der stdio-Puffer usw. Daher ist dies keine Standardmethode zum Beenden und sollte nur in speziellen Fällen verwendet werden. Am häufigsten geschieht dies bei den vom os.fork erstellten Kindprozessen.

    Bitte beachten Sie, dass von den vier gegebenen Methoden nur diese hier einzigartig in dem ist, was sie tut.

Zusammengefasst beenden alle vier Methoden das Programm. Die ersten beiden gelten jedoch als ungeeignet für die Verwendung im Produktionscode und die letzte ist eine nicht standardmäßige, unsaubere Methode, die nur in besonderen Szenarien verwendet wird. Wenn Sie also ein Programm normal beenden möchten, greifen Sie auf die dritte Methode zurück: sys.exit.


Oder meiner Meinung nach noch besser, Sie können direkt das tun, was sys.exit im Hintergrund macht, und ausführen:

raise SystemExit

Auf diese Weise müssen Sie zuerst nicht sys importieren.

Diese Wahl betrifft jedoch nur den Stil und liegt ganz bei Ihnen.

148voto

Dietrich Epp Punkte 193178

Die Funktionen* quit(), exit() und sys.exit() funktionieren auf die gleiche Weise: sie werfen die Ausnahme SystemExit. Es gibt also keinen wirklichen Unterschied, außer dass sys.exit() immer verfügbar ist, während exit() und quit() nur verfügbar sind, wenn das site-Modul importiert wird (docs).

Die Funktion os._exit() ist speziell, sie beendet sofort, ohne irgendwelche Aufräumfunktionen aufzurufen (zum Beispiel werden Puffer nicht geleert). Dies ist für sehr spezialisierte Anwendungsfälle gedacht... im Grunde genommen nur im Kindprozess nach einem Aufruf von os.fork().

Schlussfolgerung

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

  • Verwenden Sie sys.exit() in Skripten, oder raise SystemExit(), wenn Sie das bevorzugen.

  • Verwenden Sie os._exit() für Kindprozesse, um sich nach einem Aufruf von os.fork() zu beenden.

All diese Funktionen können ohne Argumente aufgerufen werden, oder Sie können den Beendigungsstatus angeben, z.B. exit(1) oder raise SystemExit(1), um mit dem Status 1 zu beenden. Beachten Sie, dass portable Programme auf Beendigungsstatus-Codes im Bereich von 0-255 beschränkt sind; wenn Sie auf vielen Systemen raise SystemExit(256) verwenden, wird dies abgeschnitten und Ihr Prozess wird tatsächlich mit dem Status 0 beendet.

Fußnoten

* Tatsächlich sind quit() und exit() aufrufbare Instanzobjekte, aber ich denke, es ist in Ordnung, sie Funktionen zu nennen.

67voto

Verschiedene Arten zu Beenden

os._exit():

  • Beendet den Prozess, ohne die Aufräum-Handler aufzurufen.

exit(0):

  • Ein sauberer Ausstieg ohne Fehler/Probleme.

exit(1):

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

sys.exit():

  • Wenn das System und Python heruntergefahren wird; bedeutet, dass weniger Speicher verwendet wird, nachdem das Programm ausgeführt wurde.

quit():

  • Schließt die Python-Datei.

Zusammenfassung

Grundsätzlich tun sie alle das Gleiche, jedoch hängt es auch davon ab, wofür du es benutzt.

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

Du würdest sys.exit() und os._exit() hauptsächlich verwenden, wenn du große Dateien verwendest oder Python benutzt, um das Terminal zu steuern.

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

46voto

oefe Punkte 18208

sys.exit ist der kanonische Weg, um zu beenden.

Intern ruft sys.exit einfach SystemExit auf. Das Aufrufen von sys.exit ist jedoch idiomatischer als das direkte Aufrufen von SystemExit.

os.exit ist ein systemnaher Aufruf, der direkt beendet, ohne irgendwelche Aufräumroutinen aufzurufen.

quit und exit existieren nur, um einen einfachen Ausweg aus der Python-Eingabeaufforderung zu bieten. Dies ist für neue Benutzer oder Benutzer, die versehentlich in die Python-Eingabeaufforderung gelangt sind und die richtige Syntax nicht kennen. Sie werden wahrscheinlich versuchen, exit oder quit einzugeben. obwohl dies den Interpreter nicht beendet, gibt es zumindest eine Meldung aus, die ihnen einen Ausweg zeigt:

>>> exit
Verwenden Sie exit() oder Strg-D (d.h. EOF), um zu beenden
>>> exit()
$

Dies ist im Wesentlichen nur ein Hack, der die Tatsache nutzt, dass der Interpreter die __repr__ eines jeden Ausdrucks ausgibt, den Sie an der Eingabeaufforderung eingeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X