program python exit

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



python exit program (3)

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?


Esto es al menos en ralentí ...

  • exit Sale y mata el programa con una imagen de this .

  • sys.exit es similar a break dentro de un bucle, que simplemente detiene el código allí mismo, y no continúa, aún mantiene Python abierto.


Si uso exit() en un código y lo ejecuto en el shell, se muestra un mensaje que pregunta si quiero finalizar 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.


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

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 programas .

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.