1228 votes

Comment terminer un script ?

Je suis conscient de la die() en PHP qui quitte un script prématurément.

Comment puis-je faire cela en Python ?

1 votes

Utilisez simplement import os os._exit()

1603voto

pjz Points 11925
import sys
sys.exit()

les détails de la sys documentation des modules :

sys.**exit**([_arg_])

Sortie de Python. Ceci est implémenté en levant l'option SystemExit exception, de sorte que les actions de nettoyage spécifiées par les clauses finales de try sont respectées, et il est possible d'intercepter la tentative de tentative de sortie à un niveau extérieur.

L'argument facultatif arg peut être un entier donnant l'état de sortie (par défaut à zéro), ou un autre type d'objet. S'il s'agit d'un nombre entier zéro est considéré comme une "terminaison réussie" et toute valeur différente de zéro est est considérée comme une "terminaison anormale" par les shells et autres. La plupart des systèmes exigent qu'il soit compris entre 0 et 127, et produisent des résultats non définis dans le cas contraire. Certains systèmes ont une convention pour attribuer des significations spécifiques à des codes de sortie spécifiques, mais elles sont généralement généralement sous-développés ; les programmes Unix utilisent généralement 2 pour les erreurs de 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é sur stderr et donne lieu à un code de sortie de 1. En particulier, sys.exit("some error message") est un moyen rapide de quitter un programme lorsqu'une une erreur se produit.

Depuis exit() ne lève "que" finalement une exception, il ne quittera le processus le processus que lorsqu'il est appelé depuis le thread principal, et l'exception n'est pas interceptée.

Notez qu'il s'agit là de la façon "agréable" de quitter le système. @ glyphtwistedmatrix ci-dessous indique que si vous voulez une "sortie dure", vous pouvez utiliser os._exit(*errorcode*) Il est également moins convivial puisqu'il ne permet pas à l'interpréteur de faire le ménage avant la mort du processus. D'un autre côté, elle fait tuer l'ensemble du processus, y compris tous les threads en cours d'exécution, tout en sys.exit() (comme indiqué dans la documentation) ne s'arrête que si elle est appelée depuis le thread principal, sans aucun autre thread en cours d'exécution.

14 votes

Probablement sys.exit() ne fonctionne pas (ne tue pas le processus, mais seulement le fil) s'il est déclenché par un fil d'arrière-plan ?

1 votes

@cesium62 : Oui, sys.exit() soulève un SystemExit dans le fil de discussion actuel.

15 votes

Existe-t-il un moyen de terminer un script sans lever une exception ? Je passe déjà les drapeaux pertinents hors du script avec le piping print to stdout dans Popen, donc l'exception dans ce cas cause plus de problèmes qu'elle n'en résout.

442voto

Stickman803 Points 144

Une façon simple de mettre fin prématurément à un script Python est d'utiliser la commande intégrée quit() fonction. Il n'est pas nécessaire d'importer une quelconque bibliothèque, et c'est efficace et simple.

Exemple :

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

111 votes

Aussi sys.exit() mettra fin à tous les scripts python, mais quit() ne met fin qu'au script qui l'a engendré.

5 votes

Savez-vous si cette commande fonctionne différemment dans python 2 et python 3 ?

1 votes

Quelqu'un sait-il si cela va quitter l'ensemble de l'interpréteur, ou juste provoquer l'arrêt de l'exécution du script ? Plus précisément : pour un script exécuté dans Spyder, l'interpréteur Python restera-t-il interactif, ou sera-t-il tué ? Essayez d'arrêter simplement le script de continuer, mais laissez l'interactivité de l'interpréteur présente.

135voto

Vhaerun Points 2467

Un autre moyen est :

raise SystemExit

42 votes

@Alessa : cela semble plus élégant, mais ce n'est pas recommandé : vous levez directement une exception intégrée au lieu de la solution préférable (et réinscriptible). sys.exit emballage

1 votes

C'est un moyen parfait pour moi : Il suffit de quitter le script en cours d'exécution mais pas de quitter l'IDLE.

94voto

Space cowboy Points 71

Vous pouvez également 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é depuis 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.

2 votes

Pour moi, os._exit(0) était le moyen le plus élégant. Toutes les autres soulèvent des erreurs indésirables

74voto

Glyph Points 17756

Bien que vous devriez généralement préférer sys.exit parce qu'elle est plus "conviviale" pour les autres codes, tout ce qu'elle fait en réalité est de lever une exception.

Si vous êtes sûr de devoir quitter un processus immédiatement, et que vous êtes à l'intérieur d'un gestionnaire d'exception qui attraperait SystemExit il existe une autre fonction - os._exit - qui se termine immédiatement au niveau C et n'effectue aucune des opérations normales de démontage de l'interpréteur ; par exemple, les hooks enregistrés avec le module "atexit" ne sont pas exécutés.

0 votes

Utilisé dans AWS Glue Job, os._exit() est le seul moyen de terminer le travail correctement et sans erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X