1396 Stimmen

Wie kann ein Skript beendet werden?

Ich bin mir bewusst, dass die die() Befehl in PHP, mit dem ein Skript vorzeitig beendet wird.

Wie kann ich dies in Python tun?

4 Stimmen

Verwenden Sie einfach import os os._exit()

0 Stimmen

1794voto

pjz Punkte 39845
import sys
sys.exit()

Details aus dem sys Modul-Dokumentation :

sys.**exit**([_arg_])

Beenden von Python. Dies wird implementiert, indem die SystemExit Ausnahme, so dass durch finally-Klauseln festgelegte Bereinigungsaktionen von try Anweisungen werden beachtet, und es ist möglich, die Ausstiegsversuch auf einer äußeren Ebene abzufangen.

Das optionale Argument arg kann eine ganze Zahl sein, die den Exit-Status angibt angibt (Standardwert ist Null), oder ein anderer Objekttyp. Wenn es eine ganze Zahl ist, Null als "erfolgreiche Beendigung" und jeder Wert ungleich Null als von Shells und dergleichen als "abnormaler Abbruch" betrachtet. Die meisten Systeme erfordern, dass der Wert im Bereich 0-127 liegt, und erzeugen andernfalls undefinierte Ergebnisse andernfalls. Einige Systeme haben eine Konvention für die Zuweisung spezifischer Bedeutung für bestimmte Exit-Codes, aber diese sind im Allgemeinen unterentwickelt; Unix-Programme verwenden im Allgemeinen 2 für Syntaxfehler in der Befehlszeile Fehler und 1 für alle anderen Arten von Fehlern. Wenn ein anderer Typ von Objekt übergeben wird, ist None gleichbedeutend mit der Übergabe von Null, und jedes andere Objekt wird gedruckt nach stderr und führt zu einem Exit-Code von 1. Im Einzelnen, sys.exit("some error message") ist eine schnelle Möglichkeit, ein Programm zu beenden, wenn ein Fehler auftritt.

Desde exit() letztlich "nur" eine Ausnahme auslöst, wird es nur beendet den Prozess, wenn er vom Haupt-Thread aus aufgerufen wird, und die Ausnahme wird nicht abgefangen.

Beachten Sie, dass dies die "nette" Art des Ausstiegs ist. @ glyphtwistedmatrix unten weist darauf hin, dass Sie, wenn Sie einen "harten Ausstieg" wünschen, Folgendes verwenden können os._exit(*errorcode*) obwohl es wahrscheinlich bis zu einem gewissen Grad os-spezifisch ist (es könnte zum Beispiel keinen Fehlercode unter Windows annehmen), und es ist definitiv weniger freundlich, da es den Interpreter keine Aufräumarbeiten durchführen lässt, bevor der Prozess stirbt. Andererseits ist es tut den gesamten Prozess, einschließlich aller laufenden Threads, beenden, während sys.exit() (wie es in der Dokumentation heißt) wird nur beendet, wenn es vom Hauptthread aufgerufen wird und keine anderen Threads laufen.

19 Stimmen

Vermutlich sys.exit() funktioniert nicht (beendet nicht den Prozess, sondern nur den Thread), wenn es von einem Hintergrund-Thread ausgelöst wird?

2 Stimmen

@cesium62: Ja, sys.exit() erhebt eine SystemExit Ausnahme im aktuellen Thread.

20 Stimmen

Gibt es eine Möglichkeit, ein Skript zu beenden, ohne eine Ausnahme auszulösen? Ich übergebe bereits relevante Flags aus dem Skript mit print to stdout piping in Popen, so dass die Ausnahme in diesem Fall mehr Probleme verursacht als sie löst.

503voto

j.m.g.r Punkte 4805

Eine einfache Möglichkeit, ein Python-Skript vorzeitig zu beenden, ist die Verwendung der eingebauten quit() Funktion. Es muss keine Bibliothek importiert werden und ist effizient und einfach.

Beispiel:

#do stuff
if this == that:
  quit()

131 Stimmen

Auch sys.exit() beendet alle Python-Skripte, aber quit() beendet nur das Skript, das es ausgelöst hat.

5 Stimmen

Wissen Sie, ob dieser Befehl in python 2 und python 3 anders funktioniert?

1 Stimmen

Weiß jemand, ob dadurch der gesamte Interpreter beendet wird oder nur das Skript nicht mehr ausgeführt wird? Speziell für ein Skript, das in Spyder läuft, bleibt der Python-Interpreter interaktiv, oder wird er beendet? Versuchen Sie, das Skript einfach nur anzuhalten, aber die Interaktivität des Interpreters beizubehalten.

151voto

Vhaerun Punkte 12116

Eine andere Möglichkeit ist:

raise SystemExit

45 Stimmen

@Alessa: es sieht eleganter aus, aber es ist nicht empfehlenswert: Sie lösen direkt eine eingebaute Ausnahme aus, anstatt die vorzuziehende (und überschreibbare) sys.exit Umschlag

5 Stimmen

Das ist ein perfekter Weg für mich: Einfach das laufende Skript beenden, aber nicht den IDLE beenden

98voto

Space cowboy Punkte 1019

Sie können auch einfach exit() .

Bitte beachten Sie, dass sys.exit() , exit() , quit() y os._exit(0) töten den Python-Interpreter. Wenn es also in einem Skript erscheint, das von einem anderen Skript durch execfile() wird die Ausführung beider Skripte gestoppt.

Siehe " Ausführung eines mit execfile aufgerufenen Skripts stoppen ", um dies zu vermeiden.

5 Stimmen

Für mich war os._exit(0) der eleganteste Weg. Alle anderen führten zu unerwünschten Fehlern

1 Stimmen

Bitte verwenden Sie nicht quit() ou exit() in Ihrem Code. Diese Funktionen sind nur für das interaktive Python gedacht. Siehe Python-Exit-Befehle - warum so viele und wann sollten sie verwendet werden?

80voto

Glyph Punkte 30137

Im Allgemeinen sollten Sie jedoch Folgendes bevorzugen sys.exit weil es "freundlicher" zu anderem Code ist, ist alles, was es tatsächlich tut, eine Ausnahme auszulösen.

Wenn Sie sicher sind, dass Sie einen Prozess sofort beenden müssen, und Sie könnten sich innerhalb eines Exception-Handlers befinden, der die SystemExit gibt es eine weitere Funktion - os._exit - der sofort auf der C-Ebene beendet wird und keine der normalen Abbauprozesse des Interpreters durchführt; zum Beispiel werden die im Modul "atexit" registrierten Hooks nicht ausgeführt.

1 Stimmen

Verwendet in AWS Glue Job, os._exit() ist die einzige Möglichkeit, den Auftrag ordnungsgemäß und ohne Fehler zu beenden.

0 Stimmen

@Jérémy aber ist es eine anmutige Shutdown? wissen Sie, wenn Sie Dinge nach diesem hängen haben kann? Neu in Python, also ignorieren Sie meinen Mangel an Wissen

2 Stimmen

@bogdan.rusu, os._exit() beendet den gesamten Prozess ohne jegliche Bereinigung. Da in AWS die laufende VM-Instanz am Ende des Auftrags verworfen wird, stellt dies für mich kein Problem dar.

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