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

409

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?

Drake Guan
fuente

Respuestas:

471

exites un ayudante para el shell interactivo: sys.exitestá destinado para su uso en programas.

El sitemódulo (que se importa automáticamente durante el inicio, excepto si se da la -Sopción de línea de comandos) agrega varias constantes al espacio de nombres incorporado (por ejemplo exit) . Son útiles para el intérprete interactivo y no deben usarse en programas .


Técnicamente, hacen casi lo mismo: criar SystemExit. sys.exitlo 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 exitse 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()).

miku
fuente
44
Sospecho que exit (main ()) es un idioma común porque la gente no se da cuenta de que no debe usarse en la nota de programas . Funciona bien a menos que -Sse use. Una forma de hacerlo funcionar incluso con -Ses especificar from sys import *.
nobar
55
@nobar, cierto, pero realmente no quieres usarlo from module import *.
miku
@EvgeniSergeev, ¿no estoy seguro de lo que estás preguntando exactamente? Puede ser una pregunta interesante por sí sola.
miku
Sería una buena adición a esta respuesta para ver qué problemas, si hay alguno, para usar cualquiera de las tres funciones de salida dentro de un "con declaración".
DevPlayer
32

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.

Ramisa Anjum Aditi
fuente
2
Esto se debe a que está diseñado para su uso en el shell interactivo. Entonces, incluso si desea el diálogo, sys.exit()debe usarse dentro de los programas.
TheTechRobo36414519