En Python, hay dos funciones con nombres similares, exit()
y sys.exit()
. ¿Cuál es la diferencia y cuándo debo usar uno sobre el otro?
En Python, hay dos funciones con nombres similares, exit()
y sys.exit()
. ¿Cuál es la diferencia y cuándo debo usar uno sobre el otro?
Respuestas:
exit
es un ayudante para el shell interactivo: sys.exit
está destinado para su uso en programas.
El
site
módulo (que se importa automáticamente durante el inicio, excepto si se da la-S
opción de línea de comandos) agrega varias constantes al espacio de nombres incorporado (por ejemploexit
) . Son útiles para el intérprete interactivo y no deben usarse en programas .
Técnicamente, hacen casi lo mismo: criar SystemExit
. sys.exit
lo 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 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 controladores de limpieza, vaciar los buffers stdio, etc. (y que normalmente solo debe usarse en el proceso secundario después de a fork()
).
from module import *
.
Si lo uso exit()
en un código y lo ejecuto en el shell, muestra un mensaje preguntando si quiero matar el programa o no. Es realmente inquietante.
Mira aquí
Pero sys.exit()
es mejor en este caso. Cierra el programa y no crea ningún cuadro de diálogo.
sys.exit()
debe usarse dentro de los programas.
-S
se use. Una forma de hacerlo funcionar incluso con-S
es especificarfrom sys import *
.