En Python, il existe deux fonctions portant le même nom, exit()
et sys.exit()
. Quelle est la différence et quand devrais-je utiliser l'un sur l'autre?
exit
est une aide pour le shell interactif - sys.exit
est destiné à être utilisé dans des programmes.
Le module
site
(importé automatiquement au démarrage, sauf si l'option-S
est fournie en ligne de commande) ajoute plusieurs constantes à l'espace de nom intégré (par exempleexit
) . Ils sont utiles pour l'interpréteur interactif Shell et ne doivent pas être utilisés dans des programmes .
Techniquement, ils font généralement la même chose: augmenter SystemExit
. _sys.exit
_ le fait dans sysmodule.c :
_static PyObject *
sys_exit(PyObject *self, PyObject *args)
{
PyObject *exit_code = 0;
if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
return NULL;
/* Raise SystemExit so callers may catch it or clean up. */
PyErr_SetObject(PyExc_SystemExit, exit_code);
return NULL;
}
_
Alors que exit
est défini dans site.py et _ sitebuiltins.py , respectivement.
_class Quitter(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return 'Use %s() or %s to exit' % (self.name, eof)
def __call__(self, code=None):
# Shells like IDLE catch the SystemExit, but listen when their
# stdin wrapper is closed.
try:
sys.stdin.close()
except:
pass
raise SystemExit(code)
__builtin__.quit = Quitter('quit')
__builtin__.exit = Quitter('exit')
_
Notez qu'il existe une troisième option de sortie, à savoir os._exit , qui se ferme sans appeler les gestionnaires de nettoyage, vider les tampons stdio, etc. (et qui ne devrait normalement être utilisé dans le processus enfant qu'après une fork()
) .
Si j'utilise exit()
dans un code et que je l'exécute dans le shell, un message s'affiche pour me demander si je veux supprimer le programme ou non. C'est vraiment dérangeant. voir ici
Mais sys.exit()
est préférable dans ce cas. Il ferme le programme et ne crée aucune boîte de dialogue.