web-dev-qa-db-fra.com

Existe-t-il une méthode qui demande à mon programme de quitter?

Pour l'option "q" (quitter) dans le menu de mon programme, j'ai le code suivant:

Elif choice == "q":
    print()

Cela a bien fonctionné jusqu'à ce que je le mette dans une boucle infinie, ce qui a gardé l'impression de lignes vierges. Y at-il une méthode qui peut quitter le programme? Sinon, pouvez-vous penser à une autre solution?

40
Kudu

Une façon est de faire:

sys.exit(0)

Vous devrez bien sûr import sys.

Une autre façon consiste à break sortir de votre boucle infinie. Par exemple, vous pouvez faire ceci:

while True:
    choice = get_input()
    if choice == "a":
        # do something
    Elif choice == "q":
        break

Une autre méthode consiste à placer votre boucle principale dans une fonction et à utiliser return:

def run():
    while True:
        choice = get_input()
        if choice == "a":
            # do something
        Elif choice == "q":
            return

if __== "__main__":
    run()

La seule raison pour laquelle vous avez besoin de la fonction run() lorsque vous utilisez return est que (contrairement à d'autres langues), vous ne pouvez pas directement utiliser return de la partie principale de votre Python (la partie qui ne fait pas partie d’une fonction).

84
Greg Hewgill

La façon réelle de terminer un programme, est d'appeler

raise SystemExit

C'est ce que sys.exitfait quand même .

Un simple SystemExit, ou avec None comme argument unique, définit le code de sortie du processus à zéro. Toute valeur d'exception non entière (raise SystemExit("some message")) affiche la valeur de l'exception sur sys.stderr Et définit le code de sortie sur 1. Une valeur entière définit le code de sortie du processus sur la valeur suivante:

$ python -c "raise SystemExit(4)"; echo $?
4
18
tzot

Dans Python 3, il existe une fonction exit():

Elif choice == "q":
    exit()
11

Voir sys.exit . Cette fonction quittera votre programme avec le statut de sortie donné.

3
avpx

Veuillez noter que les solutions basées sur sys.exit () ou toute exception peuvent ne pas fonctionner dans un environnement multithread.

Puisque exit () finalement "seulement" lève une exception, il ne sortira du processus que s'il est appelé depuis le thread principal et l'exception ne sera pas interceptée. ( doc )

Cette réponse de Alex Martelli pour plus de détails.

2
Arnaud P