2011-06-28 11 views

Respuesta

363

exit es un ayudante para el shell interactivo - sys.exit está destinado para su uso en programas.

El módulo site (que se importa de forma automática durante el inicio, excepto si se le da la opción de línea de comandos -S) añade varias constantes en el espacio de nombres incorporados (por ejemplo exit). Son útiles para el intérprete interactivo y no deben usarse en los programas.


Técnicamente, lo hacen sobre todo el mismo: elevar SystemExit. sys.exit lo hace de 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:

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, es decir os._exit, que sale sin llamar a los manipuladores de limpieza, lavado búfers de stdio, etc. (y que normalmente solo deberían usarse en el proceso secundario después de fork()).

+2

Sospecho que la salida (main()) es una expresión común porque las personas no se dan cuenta * no se debe utilizar en programas * nota. Funciona bien a menos que se use ['-S'] (http://docs.python.org/using/cmdline.html#cmdoption-S). Una forma de hacerlo funcionar incluso con '-S' es especificar' from sys import * '. – nobar

+5

@nobar, cierto, pero en realidad no desea usar 'from module import *'. – miku

+1

Entonces, ¿cómo se genera 'SystemExit' en otros hilos? ¿Lo es, incluso? –

7

Si uso exit() en un código y lo ejecuto en el shell, muestra un mensaje preguntándome si quiero matar el programa o no. Es realmente perturbador. See here

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

Cuestiones relacionadas