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

73voto

eaydin Punkte 928

Ich habe gerade herausgefunden, dass beim Schreiben einer Multithreading-Anwendung, raise SystemExit y sys.exit() beides tötet nur den laufenden Thread. Andererseits, os._exit() verlässt den gesamten Prozess. Dies wurde diskutiert in " Warum wird sys.exit() nicht beendet, wenn es innerhalb eines Threads in Python aufgerufen wird? ".

Das folgende Beispiel hat 2 Threads. Kenny und Cartman. Cartman soll ewig leben, aber Kenny wird rekursiv aufgerufen und soll nach 3 Sekunden sterben. (Rekursiver Aufruf 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 Andernfalls wird nur 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()

7 Stimmen

Dies scheint die einzige Möglichkeit zu sein, mit unangenehm verzögerten Rückrufen umzugehen! (d.h. Multithreading-Methoden).

5 Stimmen

Gut gemacht. Keine der anderen Antworten befasst sich direkt mit mehreren Threads, sondern nur mit Skripten, die andere Skripte hervorbringen.

36voto

cleg Punkte 4594
from sys import exit
exit()

Als Parameter können Sie einen Exit-Code übergeben, der an das Betriebssystem zurückgegeben wird. Standard ist 0.

3 Stimmen

In meinem Fall brauchte ich Exit nicht einmal zu importieren.

25voto

Floggedhorse Punkte 625

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 __name__ == '__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 __name__ == '__main__': 
    main()

...

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

Modifier

Es geht darum, dass das Programm reibungslos und friedlich endet und nicht "ICH HABE AUFGEHÖRT !!!!"

26 Stimmen

Ein Problem besteht darin, dass man in verschachtelten Funktionen, die man verlassen möchte, entweder eine Flagge bis zur obersten Funktion senden muss, oder man kehrt einfach zur nächsthöheren Ebene zurück.

18 Stimmen

Das ist absoluter Unsinn, wenn Sie damit sagen wollen, Sie könnten return um das Skript zu beenden. Alle return ist die Rückgabe eines Wertes und eines Kontrollflusses an die aufrufende Funktion. Dort wird die Ausführung direkt nach dem Aufruf der Funktion, die die return . Natürlich, wenn die return die letzte Anweisung in Ihrem Skript ist, wie in Ihrem Beispiel, dann wird das Skript direkt nach dem Aufruf beendet.

4 Stimmen

Es gibt ein starkes Argument für diesen Ansatz: (1) "Ausgang" aus der Mitte ist wohl ein "goto", daher eine natürliche Abneigung; (2) "Ausgang" in Bibliotheken sind definitiv schlechte Praxis (und alles eine Bibliothek werden kann), denn was eine Bibliothek als "unwiederbringlich" gilt, ist in der Regel in Ordnung für den Anrufer . (Hinweis: Die Verwendung von Exceptions für Exits ist eine praktische Python-Umgehung für C/C++/Java-Entwickler, die immer unangemessen exit -- daher bemerken Python-Programmierer den Gestank dieses Codes vielleicht nicht so sehr); und schließlich (3) Multi-Thread-Code (der von Pythonisten bisher einfach ignoriert wurde).

18voto

Artyom Vancyan Punkte 1623

Problem

In meiner Praxis gab es sogar einen Fall, in dem es notwendig war, eine gesamte Multiprozessor-Anwendung von einem dieser Prozesse aus zu beenden.

Die folgenden Funktionen funktionieren gut, wenn Ihre Anwendung nur den Hauptprozess verwendet. Aber keine der folgenden Funktionen funktionierte in meinem Fall, da die Anwendung viele andere aktive Prozesse hatte.

  • quit()
  • exit(0)
  • os._exit(0)
  • sys.exit(0)
  • os.kill(os.getppid(), 9) - wo os.getppid() es el pid des übergeordneten Prozesses

Der letzte Prozess hat den Hauptprozess und sich selbst beendet, aber die übrigen Prozesse waren noch am Leben.

Lösung

Ich musste es mit einem externen Befehl beenden und fand schließlich eine Lösung mit pkill .

import os

# This can be called even in process worker and will kill
# whole application included correlated processes as well
os.system(f"pkill -f {os.path.basename(__file__)}")

2 Stimmen

Ihr exakter Code hat bei mir nicht funktioniert, aber Sie haben mich auf den richtigen Weg gebracht: os.system("pkill -f " + sys.argv[0])

11voto

David C. Punkte 1834

In Python 3.5 habe ich versucht, ähnlichen Code ohne Verwendung von Modulen (z.B. sys, Biopy) einzubauen, außer dem, was eingebaut ist, um das Skript zu stoppen und eine Fehlermeldung für meine Benutzer auszugeben. 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 habe ich festgestellt, dass es prägnanter ist, einfach einen Fehler zu melden:

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

1 Stimmen

Ich stimme voll und ganz zu, dass es besser ist, für jeden Fehler, der von der Anwendung behandelt werden kann, eine Ausnahme auszulösen. Aber die Frage war, wie man ein Python-Skript beendet, also ist dies nicht wirklich eine (neue) Antwort auf die Frage.

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