Question Terminer un script Python


Je suis au courant de die() commande en PHP qui arrête un script au début.

Comment puis-je faire cela en Python?


751
2017-09-16 15:35


origine


Réponses:


import sys
sys.exit()

détails de la sys documentation du module:

sys.Sortie([arg])

Quittez Python. Ceci est mis en œuvre en élevant le      SystemExit exception, les actions de nettoyage spécifiées par les clauses finally     de try déclarations sont honorées, et il est possible d'intercepter les     tentative de sortie à un niveau extérieur.

L'argument optionnel arg peut être un entier donnant le statut de sortie     (par défaut à zéro), ou un autre type d'objet. Si c'est un nombre entier,     zéro est considéré comme "aboutissement réussi" et toute valeur différente de zéro est     considéré comme une «terminaison anormale» par les coquilles et autres. La plupart des systèmes     exiger qu'il soit compris entre 0 et 127 et produire des résultats indéfinis     autrement. Certains systèmes ont une convention pour assigner spécifique     significations à des codes de sortie spécifiques, mais ceux-ci sont généralement     sous-développé; Les programmes Unix utilisent généralement 2 pour la syntaxe de ligne de commande     erreurs et 1 pour tous les autres types d'erreurs. Si un autre type d'objet     est passé, None est équivalent à passer à zéro, et tout autre objet est     imprimé à stderr et donne un code de sortie de 1. En particulier,      sys.exit("some error message") est un moyen rapide de quitter un programme lorsque     une erreur se produit.

Depuis exit() finalement "seulement" soulève une exception, il ne sortira     le processus lorsqu'il est appelé à partir du thread principal, et l'exception n'est pas     intercepté.

Notez que c'est le bon moyen de quitter. @glyphtwistedmatrix ci-dessous souligne que si vous voulez une 'sortie difficile', vous pouvez utiliser os._exit (code d'erreur), bien qu'il soit probablement spécifique à l'os dans une certaine mesure (il ne prendra pas un code d'erreur sous Windows, par exemple), et il est certainement moins convivial car il ne laisse pas l'interpréteur effectuer un nettoyage avant le processus.


1031
2017-09-16 15:36



Un moyen simple de terminer rapidement un script Python est d'utiliser la fonction intégrée quit (). Il n'y a pas besoin d'importer une bibliothèque, et c'est efficace et simple.

Exemple:

#do stuff
if this == that:
  quit()

219
2018-02-12 15:50



Une autre façon est:

raise SystemExit

102
2017-09-16 15:37



Alors que vous devriez généralement préférer sys.exit parce qu'il est plus "amical" avec les autres codes, tout ce qu'il fait est de lever une exception.

Si vous êtes sûr que vous avez besoin de quitter un processus immédiatement, et vous pourriez être dans un gestionnaire d'exception qui attraperait SystemExit, il y a une autre fonction - os._exit - qui se termine immédiatement au niveau C et n'effectue aucun démontage normal de l'interprète; par exemple, les hooks enregistrés avec le module "atexit" ne sont pas exécutés.


59
2017-09-16 20:08



Vous pouvez aussi utiliser simplement exit().

Garde en tête que sys.exit(), exit(), quit(), et os._exit(0)  tuer l'interpréteur Python. 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ête l'exécution d'un script appelé avec execfile" pour éviter cela.


47
2018-04-22 14:57



from sys import exit
exit()

En tant que paramètre, vous pouvez passer un code de sortie, qui sera renvoyé à OS. La valeur par défaut est 0.


25
2017-09-16 15:38



Je suis un novice total mais sûrement c'est 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 __name__ == '__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 __name__ == '__main__': 
    main()

...

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

modifier

Le point étant que le programme se termine sans heurts et pacifiquement, plutôt que "J'ai arrêté !!!"


16
2018-03-19 11:13



Je viens de découvrir que lorsque vous écrivez une application multithread, raise SystemExit et sys.exit() les deux ne tue que le fil courant. D'autre part, os._exit() quitte le processus entier. Cela a été discuté ici.

L'exemple ci-dessous a 2 threads. Kenny et Cartman. Cartman est censé vivre pour toujours, mais Kenny est appelé récursivement et devrait mourir après 3 secondes. (L'appel récursif n'est pas le meilleur moyen, mais j'avais d'autres raisons)

Si nous voulons aussi que Cartman meure quand Kenny meurt, Kenny devrait s'en aller avec os._exitsinon, 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 __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()

13
2017-11-10 10:59



Dans Python 3.5, j'ai essayé d'incorporer du code similaire sans utiliser de modules (par exemple sys, Biopy) autre que ce qui est intégré pour arrêter le script et imprimer un message d'erreur à 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 succint de juste jeter une erreur:

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

5
2017-12-27 18:12