Różnica między exit () a sys.exit () w Pythonie

409

W Pythonie istnieją dwie podobnie nazwane funkcje exit()oraz sys.exit(). Jaka jest różnica i kiedy powinienem stosować jeden na drugim?

Drake Guan
źródło

Odpowiedzi:

471

exitjest pomocnikiem dla interaktywnej powłoki - sys.exitjest przeznaczony do użytku w programach.

siteModuł (który jest importowany automatycznie podczas uruchamiania systemu, chyba że -Sopcja wiersza polecenia jest podana) dodaje kilka stałych do wbudowanej przestrzeni nazw (np exit) . 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.exitrobi 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ż exitjest 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()).

miku
źródło
4
Podejrzewam, że wyjście (main ()) jest powszechnym idiomem, ponieważ ludzie nie wybierają tego, czego nie należy używać w notatkach programów . Działa dobrze, chyba że -Szostanie użyty. Sposobem na to, aby działał nawet z, -Sjest określenie from sys import *.
nobar
5
@nobar, prawda, ale tak naprawdę nie chcesz używać from module import *.
miku,
@EvgeniSergeev, nie jestem pewien, o co dokładnie pytasz? To samo może być interesujące pytanie.
miku
Byłoby miło dodać do tej odpowiedzi, aby zobaczyć, jakie problemy występują, jeśli występują jakiekolwiek z trzech funkcji wyjścia w „instrukcji z”.
DevPlayer,
32

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 tutaj

Ale sys.exit()w tym przypadku jest lepiej. Zamyka program i nie tworzy żadnego okna dialogowego.

Ramisa Anjum Aditi
źródło
2
Wynika to z faktu, że jest on przeznaczony do użycia w interaktywnej powłoce. Więc nawet jeśli chcesz okno dialogowe, sys.exit()powinno być używane w programach.
TheTechRobo36414519