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

409

En Python, il existe deux fonctions portant le même nom, exit()et sys.exit(). Quelle est la différence et quand dois-je utiliser l'un sur l'autre?

Drake Guan
la source

Réponses:

471

exitest une aide pour le shell interactif - sys.exitest destiné à être utilisé dans les programmes.

Le sitemodule (qui est importé automatiquement au démarrage, sauf si l' -Soption de ligne de commande est donnée) ajoute plusieurs constantes à l'espace de noms intégré (par exemple exit) . Ils sont utiles pour l'interpréteur interactif et ne doivent pas être utilisés dans les programmes .


Techniquement, ils font essentiellement la même chose: élever SystemExit. sys.exitle 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 exitest 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ée dans le processus enfant qu'après a fork()).

miku
la source
4
Je soupçonne que exit (main ()) est un idiome courant parce que les gens ne saisissent pas le ne devraient pas être utilisés dans les programmes . Cela fonctionne bien à moins qu'il ne -Ssoit utilisé. Un moyen de le faire fonctionner même avec -Sest de spécifier from sys import *.
nobar
5
@nobar, c'est vrai, mais vous ne voulez pas vraiment l'utiliser from module import *.
miku
@EvgeniSergeev, je ne sais pas exactement ce que vous demandez? Ce pourrait être une question intéressante en soi.
miku
Ce serait un ajout intéressant à cette réponse pour voir quels problèmes s’il y en a pour utiliser l’une des trois fonctions de sortie dans une "instruction with".
DevPlayer
32

Si j'utilise exit()dans un code et l'exécute dans le shell, il affiche un message me demandant si je veux tuer le programme ou non. C'est vraiment dérangeant. Vois ici

Mais sys.exit()c'est mieux dans ce cas. Il ferme le programme et ne crée aucune boîte de dialogue.

Ramisa Anjum Aditi
la source
2
En effet, il est conçu pour être utilisé dans le shell interactif. Donc, même si vous voulez que la boîte de dialogue sys.exit()soit utilisée dans les programmes.
TheTechRobo36414519