Je connais la commande die()
dans PHP, qui arrête un script plus tôt.
Comment puis-je faire cela en Python?
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 detry
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.
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()
Une autre façon est:
raise SystemExit
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.
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.
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.
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()
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 !!!!"
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!");