Je connais la die()
commande en PHP qui quitte un script tôt.
Comment puis-je faire cela en Python?
la source
Je connais la die()
commande en PHP qui quitte un script 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'
SystemExit
exception, donc les actions de nettoyage spécifiées par les clauses finally destry
instructions 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 (par défaut à 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 non nulle est considérée comme une «terminaison anormale» par des coques et similaires. La plupart des systèmes exigent qu'il soit compris entre 0 et 127 et produisent autrement des résultats indé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 transmis, Aucun équivaut à passer à zéro, et tout autre objet est imprimé
stderr
et entraîne un code de sortie de 1. En particulier,sys.exit("some error message")
est un moyen rapide de quitter un programme en cas d'erreur.Puisqu'en
exit()
fin de compte «seulement» lève une exception, il ne quittera le processus que lorsqu'il sera appelé à partir du thread principal, et l'exception ne sera pas interceptée.
Notez que c'est la «belle» façon de quitter. @ glyphtwistedmatrix ci-dessous souligne que si vous voulez une `` sortie matérielle '', vous pouvez l'utiliser os._exit(*errorcode*)
, bien que ce soit probablement spécifique à l'OS dans une certaine mesure (cela pourrait ne pas prendre un code d'erreur sous Windows, par exemple), et c'est certainement moins convivial car il ne laisse pas l'interprète effectuer le nettoyage avant la fin du processus.
sys.exit()
ne fonctionne pas (ne tue pas le processus, tue simplement le fil) s'il est déclenché par un fil d'arrière-plan?sys.exit()
déclenche uneSystemExit
exception dans le thread actuel.UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Un moyen simple de terminer un script Python tôt est d'utiliser la
quit()
fonction intégrée. Il n'est pas nécessaire d'importer de bibliothèque, et c'est efficace et simple.Exemple:
la source
Une autre façon est:
la source
sys.exit
wrapper préférable (etVous pouvez également utiliser simplement
exit()
.Gardez à l' esprit que
sys.exit()
,exit()
,quit()
etos._exit(0)
tuer l'interpréteur Python. Par conséquent, s'il apparaît dans un script appelé à partir d'un autre script parexecfile()
, il arrête l'exécution des deux scripts.Voir " Arrêter l'exécution d'un script appelé avec execfile " pour éviter cela.
la source
Bien que vous devriez généralement le préférer
sys.exit
car il est plus "convivial" avec un autre code, il ne fait que lever 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 gestionnaire d'exception qui se bloquerait
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ète; par exemple, les hooks enregistrés avec le module "atexit" ne sont pas exécutés.la source
Je viens de découvrir que lors de l'écriture d'une application multithread,
raise SystemExit
et lessys.exit()
deux ne tuent que le thread en cours d'exécution. En revanche,os._exit()
quitte tout le processus. Cela a été discuté dans " Pourquoi sys.exit () ne se ferme-t-il pas lorsqu'il est appelé dans un thread en Python? ".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. (les appels récursifs ne sont pas la meilleure façon, mais j'avais d'autres raisons)
Si nous voulons également que Cartman meure à la mort de Kenny, Kenny devrait s'en aller
os._exit
, sinon Kenny mourra et Cartman vivra pour toujours.la source
En tant que paramètre, vous pouvez transmettre un code de sortie, qui sera renvoyé à l'OS. La valeur par défaut est 0.
la source
exit()
et cesys.exit()
n'est pas la même chose. N'utilisez pas lesexit()
scripts intégrés , c'est juste une aide pour le shell interactif - utilisezsys.exit()
Je suis un novice total mais c'est sûrement plus propre et plus contrôlé
...
que
...
Éditer
Le point étant que le programme se termine en douceur et en paix, plutôt que "J'AI ARRÊTÉ !!!!"
la source
return
pour terminer le script. Tout ce quereturn
fait est de renvoyer une valeur et un flux de contrôle à la fonction appelante. Là, il continue avec l'exécution juste après l'appel de la fonction qui a appeléreturn
. Bien sûr, si lereturn
est la dernière instruction de votre script comme dans votre exemple, le script se termine juste après son appel.exit
- par conséquent, les programmeurs python peuvent ne pas remarquer autant l'odeur de ce code); et enfin, (3) du code multi-thread (que les pythonistes ont historiquement ignoré).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 à mes utilisateurs. Voici mon exemple:
Plus tard, j'ai trouvé qu'il était plus succinct de simplement lancer une erreur:
la source
Mes deux centimes.
Python 3.8.1, Windows 10, 64 bits.
sys.exit()
ne fonctionne pas directement pour moi.J'ai plusieurs boucles suivantes.
Je déclare d'abord une variable booléenne, que j'appelle
immediateExit
.Donc, au début du code du programme, j'écris:
Ensuite, à partir de l'exception de boucle la plus interne (imbriquée), j'écris:
Ensuite, j'entre dans la suite immédiate de la boucle externe, et avant toute autre chose exécutée par le code, j'écris:
Selon la complexité, la déclaration ci-dessus doit parfois être répétée également dans les sections sauf, etc.
Le message personnalisé est également destiné à mon débogage personnel, car les chiffres sont dans le même but - pour voir où le script se termine réellement.
Dans mon cas particulier, je traite un fichier CSV, auquel je ne veux pas que le logiciel touche, si le logiciel détecte qu'il est corrompu. Par conséquent, pour moi, il est très important de quitter l'intégralité du script Python immédiatement après avoir détecté la corruption possible.
Et en suivant la sortie progressive de toutes les boucles, j'arrive à le faire.
Code complet: (certaines modifications étaient nécessaires car il s'agit d'un code propriétaire pour les tâches internes):
la source
except:
sans type d'exception. Si vous utilisez simplementexcept Exception:
(ou même un type d'exception plus détaillé si possible), lesys.exit()
fonctionnerait comme prévu et vous n'auriez pas besoin de cette solution de contournement.sys.exit()
est en réalité une sorte de solution de dernier recours pour les erreurs critiques. Juste mes deux cents :)