W Pythonie istnieją dwie podobnie nazwane funkcje exit()
oraz sys.exit()
. Jaka jest różnica i kiedy powinienem stosować jeden na drugim?
exit
jest pomocnikiem dla interaktywnej powłoki - sys.exit
jest przeznaczony do użytku w programach.
site
Moduł (który jest importowany automatycznie podczas uruchamiania systemu, chyba że-S
opcja wiersza polecenia jest podana) dodaje kilka stałych do wbudowanej przestrzeni nazw (npexit
) . Są one przydatne dla interaktywnej powłoki interpretera i nie powinny być używane w programach .
Technicznie robią głównie to samo: podbijanie SystemExit
. sys.exit
robi to w 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;
}
Chociaż exit
jest zdefiniowany odpowiednio w site.py i _sitebuiltins.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')
Zauważ, że istnieje trzecia opcja wyjścia, a mianowicie os._exit , która kończy działanie bez wywoływania procedur czyszczenia, opróżniania buforów stdio itp. (I która normalnie powinna być używana tylko w procesie potomnym po a fork()
).
-S
zostanie użyty. Sposobem na to, aby działał nawet z,-S
jest określeniefrom sys import *
.from module import *
.Jeśli użyję
exit()
kodu i uruchomię go w powłoce, wyświetli się komunikat z pytaniem, czy chcę zabić program, czy nie. To naprawdę niepokojące. Spójrz tutajAle
sys.exit()
w tym przypadku jest lepiej. Zamyka program i nie tworzy żadnego okna dialogowego.źródło
sys.exit()
powinno być używane w programach.