Ich bin mir bewusst, dass die die()
Befehl in PHP, mit dem ein Skript vorzeitig beendet wird.
Wie kann ich dies in Python tun?
Ich bin mir bewusst, dass die die()
Befehl in PHP, mit dem ein Skript vorzeitig beendet wird.
Wie kann ich dies in Python tun?
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()
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 !!!!"
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.
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.
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).
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 ProzessesDer letzte Prozess hat den Hauptprozess und sich selbst beendet, aber die übrigen Prozesse waren noch am Leben.
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__)}")
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!")
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.
4 Stimmen
Verwenden Sie einfach
import os
os._exit()
0 Stimmen
Xonsh: xon.sh/tutorial.html#das-alles-volk