Mir ist der die()
Befehl in PHP bekannt, der ein Skript vorzeitig beendet.
Wie kann ich das in Python machen?
quelle
Mir ist der die()
Befehl in PHP bekannt, der ein Skript vorzeitig beendet.
Wie kann ich das in Python machen?
import sys
sys.exit()
Details aus der sys
Moduldokumentation :
sys.exit([arg])
Beenden Sie Python. Dies wird durch Auslösen der
SystemExit
Ausnahme implementiert , sodass Bereinigungsaktionen, die in den Klauseln "finally" vontry
Anweisungen angegeben sind, berücksichtigt werden und der Exit-Versuch auf einer äußeren Ebene abgefangen werden kann.Das optionale Argument arg kann eine Ganzzahl sein, die den Exit-Status angibt (standardmäßig Null), oder ein anderer Objekttyp. Wenn es sich um eine Ganzzahl handelt, wird Null als "erfolgreiche Beendigung" betrachtet, und jeder Wert ungleich Null wird von Schalen und dergleichen als "abnormale Beendigung" angesehen. Die meisten Systeme erfordern einen Bereich zwischen 0 und 127 und führen ansonsten zu undefinierten Ergebnissen. Einige Systeme haben eine Konvention zum Zuweisen bestimmter Bedeutungen zu bestimmten Exit-Codes, aber diese sind im Allgemeinen unterentwickelt. Unix-Programme verwenden im Allgemeinen 2 für Befehlszeilensyntaxfehler und 1 für alle anderen Arten von Fehlern. Wenn ein anderer Objekttyp übergeben wird, entspricht None dem Übergeben von Null, und jedes andere Objekt wird gedruckt
stderr
und führt zu einem Exit-Code von 1. Insbesonderesys.exit("some error message")
ist eine schnelle Möglichkeit, ein Programm zu beenden, wenn ein Fehler auftritt.Da
exit()
letztendlich "nur" eine Ausnahme auslöst, wird der Prozess nur beendet, wenn er vom Hauptthread aufgerufen wird, und die Ausnahme wird nicht abgefangen.
Beachten Sie, dass dies der "schöne" Weg zum Beenden ist. @ glyphtwistedmatrix unten weist darauf hin, dass Sie, wenn Sie einen "harten Ausgang" wünschen, diesen verwenden können os._exit(*errorcode*)
, obwohl er wahrscheinlich bis zu einem gewissen Grad os-spezifisch ist (unter Windows wird möglicherweise kein Fehlercode verwendet), und er ist definitiv weniger freundlich, da er lässt den Interpreter keine Bereinigung durchführen, bevor der Prozess beendet ist.
sys.exit()
nicht (beendet den Prozess nicht, beendet nur den Thread), wenn er von einem Hintergrund-Thread ausgelöst wird?sys.exit()
löst eineSystemExit
Ausnahme im aktuellen Thread aus.UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Eine einfache Möglichkeit, ein Python-Skript vorzeitig zu beenden, ist die Verwendung der integrierten
quit()
Funktion. Es ist nicht erforderlich, eine Bibliothek zu importieren, und sie ist effizient und einfach.Beispiel:
quelle
Ein anderer Weg ist:
quelle
sys.exit
WrappersSie können auch einfach verwenden
exit()
.Beachten Sie, dass
sys.exit()
,exit()
,quit()
, undos._exit(0)
töten den Python - Interpreter. Wenn es in einem Skript angezeigt wird, das von einem anderen Skript von aufgerufen wurdeexecfile()
, stoppt es daher die Ausführung beider Skripte.Siehe " Ausführung eines mit execfile aufgerufenen Skripts stoppen ", um dies zu vermeiden.
quelle
Während Sie im Allgemeinen bevorzugen sollten,
sys.exit
weil es für anderen Code "freundlicher" ist, löst es tatsächlich nur eine Ausnahme aus.Wenn Sie sicher sind, dass Sie einen Prozess sofort beenden müssen und sich möglicherweise in einem Ausnahmebehandler befinden, der abfangen würde
SystemExit
, gibt es eine andere Funktion -os._exit
-, die sofort auf der C-Ebene beendet wird und keinen der normalen Abrisse ausführt des Dolmetschers; Beispielsweise werden mit dem Modul "atexit" registrierte Hooks nicht ausgeführt.quelle
Ich habe gerade herausgefunden, dass , wenn eine multithreadded App schreiben,
raise SystemExit
undsys.exit()
beide nur den laufenden Faden tötet. Beendet andererseitsos._exit()
den gesamten Prozess. Dies wurde unter " Warum wird sys.exit () nicht beendet, wenn es in einem Thread in Python aufgerufen wird? " Erläutert .Das folgende Beispiel hat 2 Threads. Kenny und Cartman. Cartman soll für immer leben, aber Kenny wird rekursiv gerufen und sollte nach 3 Sekunden sterben. (rekursives Aufrufen ist nicht der beste Weg, aber ich hatte andere Gründe)
Wenn wir auch wollen, dass Cartman stirbt, wenn Kenny stirbt, sollte Kenny weggehen
os._exit
, sonst wird nur Kenny sterben und Cartman wird für immer leben.quelle
Als Parameter können Sie einen Exit-Code übergeben, der an das Betriebssystem zurückgegeben wird. Standard ist 0.
quelle
exit()
undsys.exit()
sind nicht dasselbe. Verwenden Sie nicht die eingebautenexit()
Skripte, dies ist nur ein Helfer für die interaktive Shell - verwenden Siesys.exit()
Ich bin ein absoluter Neuling, aber das ist sicherlich sauberer und kontrollierter
...
als
...
Bearbeiten
Der Punkt ist, dass das Programm reibungslos und friedlich endet, anstatt "Ich habe aufgehört !!!!"
quelle
return
das Skript beenden können. Sie müssenreturn
lediglich einen Wert und einen Steuerungsfluss an die aufrufende Funktion zurückgeben. Dort wird direkt nach dem Aufruf der aufgerufenen Funktion mit der Ausführung fortgefahrenreturn
. Wenn dies diereturn
letzte Anweisung in Ihrem Skript wie in Ihrem Beispiel ist, wird das Skript natürlich direkt nach dem Aufruf beendet.exit
Daher bemerken Python-Programmierer den Gestank dieses Codes möglicherweise nicht so stark.) und schließlich (3) Multithread-Code (den Pythonisten in der Vergangenheit einfach ignoriert haben).In Python 3.5 habe ich versucht, ähnlichen Code ohne Verwendung von Modulen (z. B. sys, Biopy) zu integrieren, außer den integrierten, um das Skript zu stoppen und eine Fehlermeldung an meine Benutzer zu drucken. Hier ist mein Beispiel:
Später fand ich es prägnanter, nur einen Fehler zu werfen:
quelle
Meine zwei Cent.
Python 3.8.1, Windows 10, 64-Bit.
sys.exit()
funktioniert nicht direkt bei mir.Ich habe mehrere nächste Schleifen.
Zuerst deklariere ich eine boolesche Variable, die ich aufrufe
immediateExit
.Also schreibe ich am Anfang des Programmcodes:
Ausgehend von der innersten (verschachtelten) Schleifenausnahme schreibe ich dann:
Dann gehe ich in die unmittelbare Fortsetzung der äußeren Schleife und bevor etwas anderes vom Code ausgeführt wird, schreibe ich:
Abhängig von der Komplexität muss die obige Aussage manchmal auch in Ausnahmeabschnitten usw. wiederholt werden.
Die benutzerdefinierte Nachricht ist auch für mein persönliches Debugging gedacht, da die Nummern dem gleichen Zweck dienen - um zu sehen, wo das Skript wirklich beendet wird.
In meinem speziellen Fall verarbeite ich eine CSV-Datei, die die Software nicht berühren soll, wenn die Software feststellt, dass sie beschädigt ist. Daher ist es für mich sehr wichtig, das gesamte Python-Skript sofort nach dem Erkennen der möglichen Beschädigung zu beenden.
Und nach dem allmählichen Verlassen aller Schleifen schaffe ich es.
Vollständiger Code: (Einige Änderungen waren erforderlich, da es sich um proprietären Code für interne Aufgaben handelt.)
quelle
except:
ohne Ausnahmetyp verwenden. Wenn Sie nurexcept Exception:
(oder wenn möglich sogar einen detaillierteren Ausnahmetyp) verwenden,sys.exit()
funktioniert der wie vorgesehen und Sie benötigen diese Problemumgehung nicht.sys.exit()
ist wirklich eine Art letzter Ausweg für kritische Fehler. Nur meine zwei Cent :)