In Python, ci sono due funzioni con nomi simili exit()
e sys.exit()
. Qual è la differenza e quando dovrei usarne uno rispetto all'altro?
In Python, ci sono due funzioni con nomi simili exit()
e sys.exit()
. Qual è la differenza e quando dovrei usarne uno rispetto all'altro?
Risposte:
exit
è un aiuto per la shell interattiva - sys.exit
è destinato all'uso nei programmi.
Il
site
modulo (che viene importato automaticamente all'avvio, tranne se-S
viene fornita l'opzione della riga di comando) aggiunge diverse costanti allo spazio dei nomi incorporato (ad esexit
. ) . Sono utili per la shell dell'interprete interattivo e non dovrebbero essere usati nei programmi .
Tecnicamente, fanno principalmente lo stesso: rilanciare SystemExit
. sys.exit
lo fa in 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;
}
Mentre exit
è definito in site.py e _sitebuiltins.py , rispettivamente.
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')
Si noti che esiste una terza opzione di uscita, vale a dire os._exit , che esce senza chiamare i gestori di pulizia, svuotare i buffer stdio, ecc. (E che normalmente dovrebbero essere utilizzati nel processo figlio solo dopo a fork()
).
from module import *
.
Se uso exit()
un codice e lo eseguo nella shell, mostra un messaggio che mi chiede se voglio uccidere il programma o meno. È davvero inquietante.
Vedere qui
Ma sys.exit()
è meglio in questo caso. Chiude il programma e non crea alcuna finestra di dialogo.
sys.exit()
dovrebbe essere utilizzato all'interno dei programmi.
-S
venga utilizzato. Un modo per farlo funzionare anche con-S
è quello di specificarefrom sys import *
.