Beenden einer Python-Skript
-
09-06-2019 - |
Frage
Ich bin mir der die()
Befehl in PHP, die früh ein Skript stoppt.
Wie kann ich dies in Python zu tun?
Lösung
import sys
sys.exit()
Details aus der sys
Modul Dokumentation :
sys.exit([arg])
Beenden von Python. Dies wird realisiert durch die Anhebung
SystemExit
Ausnahme, so Bereinigungsaktionen durch abschließendes Klauseln angegeben vontry
Aussagen geehrt werden, und es ist möglich, abzufangen, die Ausfahrt Versuch einer äußeren Ebene.Das optionale Argument arg kann eine ganze Zahl sein, den Exit-Status geben (Verzug auf Null) oder eine andere Art von Objekt. Wenn es eine ganze Zahl ist, Null wird als „erfolgreiche Beendigung“ betrachtet und jeder Nicht-Null-Wert ist als „abnormal termination“ durch Muscheln und dergleichen. Die meisten Systeme erfordern sie im Bereich von 0 bis 127, und erzeugt nicht definierte Ergebnisse zu sein Andernfalls. Einige Systeme haben eine Konvention für die Zuweisung von spezifischen Bedeutungen für bestimmte Beendigungscodes, aber diese sind im Allgemeinen unterentwickelt; Unix-Programme im Allgemeinen 2 für die Befehlszeilensyntax Fehler und 1 für alle anderen Arten von Fehlern. Wenn eine andere Art von Objekt übergeben wird, ist keine äquivalente Null vorbei, und jedes andere Objekt ist, bedruckenden
stderr
und ergibt ein Beendigungscode 1. insbesonderesys.exit("some error message")
ist ein schneller Weg, um ein Programm zu beenden, wenn ein Fehler auftritt.Da
exit()
letztlich „nur“ Raises eine Ausnahme, es wird nur Ausfahrt der Prozess, wenn sie aus dem Haupt-Thread genannt, und die Ausnahme ist nicht abgefangen.
Beachten Sie, dass dies die ‚nette‘ Art und Weise zu beenden. @ glyphtwistedmatrix unten weist darauf hin, dass, wenn Sie eine ‚harte Ausfahrt‘ möchten, können Sie verwenden os._exit ( Fehlercode ), obwohl es wahrscheinlich os spezifische zu einem gewissen Grad (es könnte nicht einen Fehlercode unter Windows zum Beispiel nehmen), und es ist auf jeden Fall weniger freundlich, da es nicht das nicht lassen Dolmetscher tun, um jede Bereinigung, bevor der Prozess stirbt.
Andere Tipps
Eine einfache Möglichkeit, einen Python-Skript zu beenden früh ist die integrierte Funktion zu verwenden beenden (). Es gibt keine Notwendigkeit, jede Bibliothek zu importieren, und es ist effizient und einfach.
Beispiel:
#do stuff
if this == that:
quit()
Eine andere Möglichkeit ist:
raise SystemExit
Während Sie in der Regel sys.exit
vorziehen sollten, weil es mehr „freundlich“ ist zu anderem Code, alles es tatsächlich tut, ist eine Ausnahme ausgelöst.
Wenn Sie sicher sind, dass Sie sofort einen Prozess beenden müssen, und Sie können innerhalb von einigen Exception-Handler sein, die SystemExit
fangen würde, gibt es eine andere Funktion - os._exit
- die sofort auf der C-Ebene beendet und führt keine von die normale tear-down des Dolmetschers; sind beispielsweise Haken mit dem „atexit“ Modul registriert nicht ausgeführt.
Sie können auch einfach exit()
verwenden.
Beachten Sie, dass sys.exit()
, exit()
, quit()
und os._exit(0)
töten , um das Python-Interpreter. Deshalb, wenn es in einem Skript von einem anderen Skript von execfile()
genannt wird, stoppt er die Ausführung beiden Skripte.
Siehe " Stoppen der Ausführung eines Skripts aufgerufen, mit execfile ", dies zu vermeiden.
from sys import exit
exit()
Als Parameter können Sie einen Exit-Code übergeben, die OS zurückgegeben werden. Der Standardwert ist 0.
Ich habe gerade herausgefunden, dass, wenn eine multithreadded App, raise SystemExit
Schreiben und sys.exit()
beide nur den laufenden Faden tötet. Auf der anderen Seite verlässt os._exit()
den gesamten Prozess. Dies wurde hier diskutiert .
Das Beispiel hat unter 2 Threads. Kenny und Cartman. Cartman soll für immer leben, aber Kenny wird rekursiv aufgerufen und sollte nach 3 Sekunden sterben. (Rekursive Berufung ist nicht der beste Weg, aber ich hatte andere Gründe)
Wenn wir auch Cartman sterben wollen, wenn Kenny stirbt, Kenny sollte mit os._exit
weggehen, sonst, nur wird Kenny sterben und Cartman wird ewig leben.
import threading
import time
import sys
import os
def kenny(num=0):
if num > 3:
# print("Kenny dies now...")
# raise SystemExit #Kenny will die, but Cartman will live forever
# sys.exit(1) #Same as above
print("Kenny dies and also kills Cartman!")
os._exit(1)
while True:
print("Kenny lives: {0}".format(num))
time.sleep(1)
num += 1
kenny(num)
def cartman():
i = 0
while True:
print("Cartman lives: {0}".format(i))
i += 1
time.sleep(1)
if __name__ == '__main__':
daemon_kenny = threading.Thread(name='kenny', target=kenny)
daemon_cartman = threading.Thread(name='cartman', target=cartman)
daemon_kenny.setDaemon(True)
daemon_cartman.setDaemon(True)
daemon_kenny.start()
daemon_cartman.start()
daemon_kenny.join()
daemon_cartman.join()
Ich bin ein totaler Anfänger, aber sicher das ist saubere und kontrollierte
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
return
print 'You wont see this'
if __name__ == '__main__':
main()
...
Programm beendet
als
import sys
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
sys.exit()
print 'You wont see this'
if __name__ == '__main__':
main()
...
Programm beendet Traceback (jüngste Aufforderung zuletzt): Die Datei "Z: \ Directory \ testdieprogram.py", Zeile 12, in (Haupt) Datei "Z: \ Verzeichnis \ testdieprogram.py", Zeile 8, in dem Haupt sys.exit () Systemexit
Bearbeiten
Der Punkt ist, dass das Programm endet sanft und friedlich, anstatt "Ich habe aufgehört !!!!"
In Python 3.5, habe ich versucht, ohne Verwendung von Modulen ähnlichen Code zu integrieren (z sys, Biopy) andere als das, was built-in ist das Skript zu stoppen und eine Fehlermeldung an meine Benutzer drucken. Hier ist mein Beispiel:
## My example:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
print("Start codon is missing! Check your DNA sequence!");
exit(); ## as most folks said above
Später fand ich es prägnanter ist, nur einen Fehler aus:
## My example revised:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
raise ValueError("Start codon is missing! Check your DNA sequence!");