Unterschied zwischen exit () und sys.exit () in Python

409

In Python gibt es zwei ähnlich benannte Funktionen exit()und sys.exit(). Was ist der Unterschied und wann sollte ich einen über den anderen verwenden?

Drake Guan
quelle

Antworten:

471

exitist ein Helfer für die interaktive Shell - sys.exitist für die Verwendung in Programmen vorgesehen.

Das siteModul (das beim Start automatisch importiert wird, außer wenn die -SBefehlszeilenoption angegeben ist) fügt dem integrierten Namespace mehrere Konstanten hinzu (zexit . B. ) . Sie sind nützlich für die interaktive Interpreter-Shell und sollten nicht in Programmen verwendet werden .


Technisch machen sie meistens dasselbe: Erhöhen SystemExit. sys.exittut dies 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;
}

While exitist in site.py bzw. _sitebuiltins.py definiert .

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')

Beachten Sie, dass es eine dritte Exit-Option gibt, nämlich os._exit , die beendet wird , ohne Bereinigungshandler aufzurufen , Standardpuffer zu leeren usw. (und die normalerweise erst nach a im untergeordneten Prozess verwendet werden sollte fork()).

miku
quelle
4
Ich vermute, dass exit (main ()) eine gängige Redewendung ist, da die Leute das nicht aufgreifen und nicht in Programmnotizen verwendet werden sollten . Es funktioniert gut, wenn -Ses nicht verwendet wird. Eine Möglichkeit, damit es auch funktioniert, -Sist die Angabe from sys import *.
Nobar
5
@nobar, stimmt, aber dann willst du nicht wirklich verwenden from module import *.
Miku
@ EvgeniSergeev, ich bin nicht sicher, was Sie genau fragen? Es könnte eine interessante Frage für sich sein.
Miku
Es wäre eine schöne Ergänzung zu dieser Antwort, um zu sehen, welche Probleme vorhanden sind, wenn eine der drei Exit-Funktionen innerhalb einer "with-Anweisung" verwendet wird.
DevPlayer
32

Wenn ich exit()einen Code verwende und ihn in der Shell ausführe, wird eine Meldung angezeigt, in der Sie gefragt werden, ob ich das Programm beenden möchte oder nicht. Es ist wirklich beunruhigend. Siehe hier

Ist sys.exit()aber in diesem Fall besser. Es schließt das Programm und erstellt kein Dialogfeld.

Ramisa Anjum Aditi
quelle
2
Dies liegt daran, dass es für die Verwendung in der interaktiven Shell konzipiert ist. Selbst wenn Sie den Dialog möchten, sys.exit()sollte er in Programmen verwendet werden.
TheTechRobo36414519