Gibt es eine Methode, die mein Programm sagt aufzuhören?
Frage
Für die "q" (quit) Option in meinem Programm-Menü, habe ich den folgenden Code:
elif choice == "q":
print()
Das ist alles in Ordnung war, bis ich es in einer Endlos-Schleife setzen, die Leerzeilen Druck gehalten. Gibt es eine Methode, die das Programm beenden kann? Else, können denken Sie an eine andere Lösung?
Lösung
Eine Möglichkeit ist zu tun:
sys.exit(0)
Sie werden auf import sys
natürlich haben.
Eine andere Möglichkeit ist Ihrer Endlosschleife break
aus. Zum Beispiel könnten Sie dies tun:
while True:
choice = get_input()
if choice == "a":
# do something
elif choice == "q":
break
Eine weitere Möglichkeit ist die Hauptschleife in Funktion zu setzen, und die Verwendung return
:
def run():
while True:
choice = get_input()
if choice == "a":
# do something
elif choice == "q":
return
if __name__ == "__main__":
run()
Der einzige Grund, warum Sie die run()
Funktion benötigen, wenn return
ist, dass (im Gegensatz zu einigen anderen Sprachen) Sie können nicht direkt return
vom Hauptteil Ihres Python-Code (der Teil, der nicht in einer Funktion ist).
Andere Tipps
Der eigentliche Weg, um ein Programm zu beenden, zu nennen, ist
raise SystemExit
Es ist, was sys.exit
tut, sowieso .
Ein einfacher SystemExit
oder mit None
als ein einziges Argument, setzt der Prozess Exit-Code auf Null. Jedes nicht-ganzzahlige Ausnahmewert (raise SystemExit("some message")
) druckt den Ausnahmewert zu sys.stderr
und setzt den Beendigungscode auf 1. Ein ganzzahliger Wert setzt den Prozess Exit-Code auf den Wert:
$ python -c "raise SystemExit(4)"; echo $?
4
In Python 3 gibt es eine exit()
Funktion:
elif choice == "q":
exit()
Siehe sys.exit
. Diese Funktion wird Ihr Programm mit dem angegebenen Exit-Status beenden.
Bitte beachten Sie, dass die Lösungen auf Basis sys.exit () oder eine Ausnahme kann nicht arbeiten in einer Multi-Threaded-Umgebung.
Da exit () schließlich „nur“ eine Ausnahme auslöst, wird es nur um den Prozess beenden, wenn sie aus dem Haupt-Thread genannt, und die Ausnahme abgefangen wird nicht. ( doc )
Diese Antwort von Alex Martelli für weitere Details.