Terminer un script Python

je suis au courant de la commande die() en PHP qui arrête un script trop tôt.

Comment puis-je faire cela en Python?

762
demandé sur Lightness Races in Orbit 2008-09-16 19:35:55

10 réponses

import sys
sys.exit()

détails du sys module documentation :

sys.exit([arg])

sortie de Python. Cela est mis en œuvre en augmentant la SystemExit de try déclarations sont honorées, et il est possible d'intercepter le sortie tentative au niveau externe.

l'argument optionnel arg peut être un entier donnant l'état de sortie (défaut à zéro), ou un autre type d'objet. Si c'est un entier, Zéro est considéré comme une "terminaison réussie" et toute valeur non nulle est considéré comme "fin anormale" par shells et similaires. La plupart des systèmes exiger qu'il soit dans l'intervalle 0-127, et produire des résultats non définis autrement. Certains systèmes ont une convention pour l'attribution spécifique Signification de codes de sortie spécifiques, mais il s'agit généralement sous-développé; les programmes Unix utilisent généralement 2 pour la syntaxe de ligne de commande les erreurs et 1 pour tous les autres types d'erreurs. Si un autre type d'objet est passé, Aucun équivaut à passer de zéro, et tout autre objet est imprimé en stderr et donne un code de sortie de 1. Notamment, sys.exit("some error message") est un moyen rapide pour quitter un programme, lorsque une erreur se produit.

depuis exit() ultimement" seul " soulève une exception, il ne sortira le processus lorsqu'il est appelé à partir du fil principal, et l'exception n'est pas intercepter.

notez que c'est la bonne façon de sortir. @ glyphtwistedmatrix ci-dessous souligne que si vous voulez une 'sortie dure', vous pouvez utiliser os._exit( code d'erreur ), bien qu'il soit probablement spécifique à os dans une certaine mesure (il pourrait ne pas prendre un errorcode sous windows, par exemple), et il est certainement moins amical car il ne laisse pas l'interpréteur faire tout nettoyage avant que le processus meurt.

1039
répondu pjz 2017-05-23 12:34:53

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

exemple:

#do stuff
if this == that:
  quit()
222
répondu j.m.g.r 2014-11-01 00:20:19

une autre voie est:

raise SystemExit
102
répondu Vhaerun 2011-09-13 20:52:49

alors que vous devriez généralement préférer sys.exit parce qu'il est plus" amical " à l'autre code, Tout ce qu'il fait réellement est de soulever une exception.

si vous êtes sûr que vous devez quitter un processus immédiatement, et que vous pourriez être à l'intérieur d'un handler 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éteur; par exemple, hooks enregistrés avec le module" atexit " ne sont pas exécutés.

59
répondu Glyph 2008-09-16 20:08:04

vous pouvez aussi utiliser simplement exit() .

Gardez à l'esprit 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êter l'exécution d'un script appelé avec l'exécutable " pour éviter cela.

47
répondu Space cowboy 2017-05-23 12:34:53
from sys import exit
exit()

comme paramètre, vous pouvez passer un code de sortie, qui sera retourné à OS. Par défaut est de 0.

25
répondu cleg 2012-05-05 00:46:16

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()

...

programme terminé Traceback (dernier appel en date): fichier "Z:\Directory\testdieprogram.py", ligne 12, dans main() du Fichier "Z:\Directory\testdieprogram.py", ligne 8, en main sys.exit () SystemExit

Modifier

le point étant que le programme se termine en douceur et paisiblement, plutôt que " J'ai arrêté !!!!"

16
répondu Floggedhorse 2017-01-18 09:22:45

je viens de découvrir que lors de l'écriture d'une application multithreadded, raise SystemExit et sys.exit() ne tue que le thread courant. D'autre part, os._exit() sort de l'ensemble du processus. Cela a été discuté ici.

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

si on veut aussi que Cartman meure à la mort de Kenny, Kenny devrait partir avec os._exit , sinon, seul Kenny mourra et Cartman vivra éternellement.

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
répondu nukacolacolic 2017-05-23 12:10:45

dans Python 3.5, j'ai essayé d'incorporer du code similaire sans utiliser de modules (par exemple sys, Biopy) autres 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 succinct de simplement 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
répondu David C. 2016-12-27 18:12:16

essayez d'utiliser pause après une boucle puis utilisez quit() ou exit().

0
répondu Lee You 2018-06-11 00:00:29