Il existe 3 fonctions de sortie, en plus de l'élévation SystemExit
.
L'élément sous-jacent est os._exit
qui nécessite 1 argument int, et sort immédiatement sans nettoyage. Il est peu probable que vous souhaitiez toucher à cette fonction, mais elle existe.
sys.exit
est défini dans sysmodule.c et exécute simplement PyErr_SetObject(PyExc_SystemExit, exit_code);
ce qui revient en fait à augmenter directement SystemExit
. Dans les moindres détails, l'augmentation SystemExit
est probablement plus rapide, puisque sys.exit
nécessite une LOAD_ATTR
y CALL_FUNCTION
vs RAISE_VARARGS
opcalls. En outre, raise SystemExit
produit un bytecode légèrement plus petit (4 octets de moins), (1 octet de plus si vous utilisez from sys import exit
depuis sys.exit
est censé renvoyer None, ce qui implique l'ajout d'un élément supplémentaire POP_TOP
).
La dernière fonction de sortie est définie dans site.py
et alias exit
o quit
dans la REPL. Il s'agit en fait d'une instance de la classe Quitter
(afin qu'elle puisse avoir un __repr__
Il s'agit donc probablement de l'opération la plus lente. De plus, il ferme sys.stdin
avant de lever SystemExit
Il est donc recommandé de l'utiliser uniquement dans le REPL.
Quant à la manière dont les SystemExit
est géré, il finit par amener la VM à appeler os._exit, mais avant cela, il fait un peu de nettoyage. Il exécute également atexit._run_exitfuncs()
qui exécute toutes les fonctions de rappel enregistrées par l'intermédiaire de la fonction atexit
module. Appel os._exit
contourne directement le atexit
pas.