web-dev-qa-db-fra.com

Différence entre exit () et sys.exit () dans Python

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?

370
Drake Guan

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 exemple exit) . 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()) .

425
miku

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.

20