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?

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


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.