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?

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()).


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.