web-dev-qa-db-fra.com

Terminer un script Python

Je connais la commande die() dans PHP, qui arrête un script plus tôt.

Comment puis-je faire cela en Python?

937
Teifion
import sys
sys.exit()

détails de la sys documentation du module :

sys.exit([arg])

Quittez Python. Ceci est implémenté en levant l'exception SystemExit , ainsi les actions de nettoyage spécifiées par les clauses finally de try sont honorées et il est possible d'intercepter la tentative de sortie à un niveau externe.

L'argument optionnel arg peut être un entier donnant le statut de sortie (la valeur par défaut étant zéro) ou un autre type d'objet. S'il s'agit d'un entier, zéro est considéré comme une "terminaison réussie" et toute valeur autre que zéro est considérée comme une "terminaison anormale" par les shells et similaires. La plupart des systèmes exigent qu'il soit compris entre 0 et 127 et produisent sinon des résultats non définis. Certains systèmes ont une convention pour attribuer des significations spécifiques à des codes de sortie spécifiques, mais ceux-ci sont généralement sous-développés; Les programmes Unix utilisent généralement 2 pour les erreurs de syntaxe de ligne de commande et 1 pour tous les autres types d’erreurs. Si un autre type d'objet est passé, None est équivalent à zéro et tout autre objet est imprimé sur stderr et donne un code de sortie égal à 1. En particulier, sys.exit("some error message") est un moyen rapide de quitter programme quand une erreur se produit.

Dans la mesure où exit() , finalement, "uniquement" soulève une exception, il ne sortira du processus que s'il est appelé à partir du thread principal, et l'exception n'est pas interceptée.

Notez qu'il s'agit du moyen "agréable" de sortir. @ glyphtwistedmatrix ci-dessous indique que si vous souhaitez une "sortie définitive", vous pouvez utiliser os._exit ( errorcode ), bien que cela soit probablement spécifique au système d'exploitation (par exemple, il ne prend pas nécessairement un code d'erreur), et il est nettement moins convivial, car il ne laisse aucun nettoyage à l'interprète avant la fin du processus.

1258
pjz

Un moyen simple de terminer tôt un script Python consiste à utiliser la fonction intégrée quit (). Il n'est pas nécessaire d'importer une bibliothèque, c'est simple et efficace.

Exemple:

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

Une autre façon est:

raise SystemExit
111
Vhaerun

Bien que vous devriez généralement préférer sys.exit car il est plus "convivial" pour les autres codes, il ne fait que lever une exception.

Si vous êtes sûr de devoir quitter immédiatement un processus et que vous êtes peut-être à l'intérieur d'un gestionnaire d'exceptions qui intercepterait SystemExit, il existe une autre fonction - os._exit - qui se termine immédiatement au niveau C et n'effectue aucune des tâches habituelles de l'interprète; Par exemple, les hooks enregistrés avec le module "atexit" ne sont pas exécutés.

62
Glyph

Vous pouvez également utiliser simplement exit().

Gardez à l'esprit que sys.exit(), exit(), quit() et os._exit(0) tue le Python interprète. Par conséquent, s'il apparaît dans un script appelé à partir d'un autre script par execfile(), il arrête l'exécution des deux scripts.

Voir " Arrêter l'exécution d'un script appelé avec execfile " pour éviter cela.

61
Space cowboy
from sys import exit
exit()

En tant que paramètre, vous pouvez transmettre un code de sortie, qui sera renvoyé au système d'exploitation. La valeur par défaut est 0.

26
cleg

Je viens de découvrir que lors de l'écriture d'une application multithreadded, raise SystemExit et sys.exit() ne tuent que le thread en cours d'exécution. D'autre part, os._exit() quitte l'ensemble du processus. Cela a été discuté ici.

L'exemple ci-dessous a 2 discussions. Kenny et Cartman. Cartman est censé vivre éternellement, mais Kenny est appelé de manière récursive et devrait mourir au bout de 3 secondes. (L'appel récursif n'est pas la meilleure solution, mais j'avais d'autres raisons.)

Si nous voulons aussi que Cartman meure quand Kenny meurt, Kenny devrait partir avec os._exit, sinon, seul Kenny mourra et Cartman vivra pour toujours.

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

Je suis un novice total mais c'est sûrement plus propre et plus contrôlé

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

if __== '__main__': 
    main()

...

Programme terminé

que

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

if __== '__main__': 
    main()

...

Traceback terminé par le programme (appel le plus récent en dernier): fichier "Z:\Répertoire\testdieprogram.py", ligne 12, dans main () fichier "Z:\Répertoire\testdieprogram.py", ligne 8, dans sys.exit principal ( ) SystemExit

Modifier

Le fait est que le programme se termine en douceur et de manière pacifique, plutôt que "JE SUIS ARRÊT !!!!"

16
Floggedhorse

Dans Python 3.5, j'ai essayé d'incorporer un code similaire sans utiliser de modules (par exemple, sys, Biopy) autres que ceux intégrés pour arrêter le script et imprimer un message d'erreur à l'intention de mes utilisateurs. Voici mon exemple:

## 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

Plus tard, j'ai trouvé qu'il est plus succinct de simplement lancer une erreur:

## 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.