Diferencia entre exit () y sys.exit () en Python

En Python, hay dos funciones con nombres similares, exit() y sys.exit() . ¿Cuál es la diferencia y cuándo debo usar una sobre la otra?

exit es una ayuda para el shell interactivo: sys.exit está diseñado para su uso en progtwigs.

El módulo del site (que se importa automáticamente durante el inicio, excepto si se da la opción de línea de comandos -S ) agrega varias constantes al espacio de nombres integrado (por ejemplo, exit ) . Son útiles para el intérprete de intérprete interactivo y no deben utilizarse en progtwigs .


Técnicamente, hacen casi lo mismo: elevar SystemExit . sys.exit hace en 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; } 

Mientras que la exit se define en site.py y _sitebuiltins.py , respectivamente.

 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') 

Tenga en cuenta que hay una tercera opción de salida, a saber, os._exit , que sale sin llamar a los manejadores de limpieza, al vaciar los buffers de stdio, etc. (y que normalmente solo se deben usar en el proceso hijo después de un fork() ).

Si uso exit() en un código y lo ejecuto en el shell, se muestra un mensaje que pregunta si quiero finalizar el progtwig o no. Es realmente inquietante. Mira aquí

Pero sys.exit() es mejor en este caso. Cierra el progtwig y no crea ningún cuadro de diálogo.