it-swarm-eu.dev

Beenden eines Python Skripts

Mir ist der Befehl die() in PHP bekannt, der ein Skript vorzeitig stoppt.

Wie kann ich das in Python machen?

937
Teifion
import sys
sys.exit()

details aus der sys module documentation :

sys.exit([arg])

Beenden Sie Python. Dies wird durch Auslösen der Ausnahme SystemExit implementiert, sodass die durch finally-Klauseln von try -Anweisungen angegebenen Bereinigungsaktionen berücksichtigt werden und es möglich ist, den Beendigungsversuch auf einer äußeren Ebene abzufangen.

Das optionale Argument arg kann eine Ganzzahl sein, die den Beendigungsstatus angibt (standardmäßig Null), oder ein anderer Objekttyp. Wenn es sich um eine Ganzzahl handelt, wird Null als "erfolgreiche Beendigung" angesehen, und jeder Wert ungleich Null wird von Shells und dergleichen als "abnormale Beendigung" angesehen. Bei den meisten Systemen muss der Bereich zwischen 0 und 127 liegen, andernfalls werden undefinierte Ergebnisse erzielt. Einige Systeme haben eine Konvention zum Zuweisen bestimmter Bedeutungen zu bestimmten Beendigungscodes, diese sind jedoch 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 der Übergabe von Null, und jedes andere Objekt wird an stderr ausgegeben. Dies führt zu einem Beendigungscode von 1. Insbesondere ist sys.exit("some error message") eine schnelle Möglichkeit, a zu beenden Programm, 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 "nette" Weg zum Verlassen ist. @ glyphtwistedmatrix unten weist darauf hin, dass Sie, wenn Sie einen "Hard Exit" möchten, os._exit ( errorcode ) verwenden können, obwohl es in gewissem Maße os-spezifisch ist (es kann zum Beispiel unter Windows keinen Fehlercode annehmen) und definitiv weniger benutzerfreundlich ist, da der Interpreter keine Bereinigung vornimmt, bevor der Prozess endet.

1258
pjz

Eine einfache Möglichkeit, ein Python -Skript vorzeitig zu beenden, ist die Verwendung der integrierten Funktion quit (). Es ist nicht erforderlich, eine Bibliothek zu importieren, und dies ist effizient und einfach.

Beispiel:

#do stuff
if this == that:
  quit()
284
j.m.g.r

Ein anderer Weg ist:

raise SystemExit
111
Vhaerun

Während Sie im Allgemeinen sys.exit vorziehen sollten, weil es für anderen Code "freundlicher" ist, löst es eigentlich nur eine Ausnahme aus.

Wenn Sie sicher sind, dass Sie einen Prozess sofort beenden müssen und sich möglicherweise in einem Ausnahmehandler befinden, der SystemExit abfängt, gibt es eine andere Funktion - os._exit -, die sofort auf der C-Ebene und beendet wird führt keinen normalen Abriss des Dolmetschers durch; Beispielsweise werden Hooks, die beim Modul "atexit" registriert sind, nicht ausgeführt.

62
Glyph

Sie können auch einfach exit() verwenden.

Denken Sie daran, dass sys.exit(), exit(), quit() und os._exit(0) den Python -Interpreter töten . Wenn es daher in einem Skript erscheint, das von einem anderen Skript mit execfile() aufgerufen wurde, wird die Ausführung beider Skripts gestoppt.

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

61
Space cowboy
from sys import exit
exit()

Als Parameter können Sie einen Exit-Code übergeben, der an OS zurückgegeben wird. Die Standardeinstellung ist 0.

26
cleg

Ich habe gerade herausgefunden, dass beim Schreiben einer Multithread-App raise SystemExit und sys.exit() beide nur den laufenden Thread beenden. Auf der anderen Seite beendet os._exit() den gesamten Prozess. Dies wurde besprochen hier.

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 mit os._exit weggehen, sonst wird nur Kenny sterben und Cartman wird für immer 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 __== '__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()
25
eaydin

Ich bin ein absoluter Neuling, aber das ist sicher sauberer und kontrollierter

def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        return
    print 'You wont see this'

if __== '__main__': 
    main()

...

Programm abgebrochen

als

import sys
def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        sys.exit()
    print 'You wont see this'

if __== '__main__': 
    main()

...

Programm beendet Traceback (letzter Aufruf zuletzt): Datei "Z:\Directory\testdieprogram.py", Zeile 12, in main () Datei "Z:\Directory\testdieprogram.py", Zeile 8, in main sys.exit ( ) SystemExit

Bearbeiten

Der Punkt ist, dass das Programm reibungslos und friedlich endet, anstatt "Ich habe aufgehört !!!!"

16
Floggedhorse

In Python 3.5 habe ich versucht, ähnlichen Code ohne Verwendung von anderen Modulen (z. B. sys, Biopy) als den integrierten zu integrieren, um das Skript anzuhalten und eine Fehlermeldung für meine Benutzer auszudrucken. 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 stellte ich fest, dass es prägnanter ist, nur einen Fehler zu werfen:

## My example revised:
if "ATG" in my_DNA: 
    ## <Do something & proceed...>
else: 
    raise ValueError("Start codon is missing! Check your DNA sequence!");
6
David C.