Разница между exit () и sys.exit () в Python

409

В Python есть две функции с одинаковыми именами, exit()и sys.exit(). Какая разница и когда я должен использовать один над другим?

Дрейк Гуан
источник

Ответы:

471

exitявляется помощником для интерактивной оболочки - sys.exitпредназначен для использования в программах.

siteМодуль (который импортируется автоматически во время запуска, за исключением , если -Sпараметр командной строки задается) добавляет несколько констант для встроенных имен (например exit) . Они полезны для оболочки интерактивного интерпретатора и не должны использоваться в программах .


Технически они делают в основном то же самое: повышение SystemExit. sys.exitделает это в 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;
}

Хотя exitопределяется в site.py и _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')

Обратите внимание, что существует третий параметр выхода, а именно os._exit , который завершается без вызова обработчиков очистки, очистки буферов stdio и т. Д. (И который обычно должен использоваться только в дочернем процессе после a fork()).

Мик
источник
4
Я подозреваю, что выход (main ()) является распространенной идиомой, потому что люди не понимают, не должны использоваться в заметках программ . Он отлично работает, если -Sне используется. Способ заставить это работать даже с -Sуказанием from sys import *.
Нобар
5
@nobar, правда, но тогда вы действительно не хотите использовать from module import *.
мику
@ EvgeniSergeev, я не уверен, что именно вы спрашиваете? Это может быть интересный вопрос сам по себе.
мику
Было бы неплохо добавить к этому ответу, чтобы увидеть, какие проблемы, если таковые имеются, для использования любой из трех функций выхода в «с оператором».
DevPlayer
32

Если я использую exit()код и запускаю его в оболочке, он показывает сообщение, спрашивающее, хочу ли я убить программу или нет. Это действительно тревожит. Посмотреть здесь

Но sys.exit()лучше в этом случае. Он закрывает программу и не создает никаких диалоговых окон.

Рамиса Анжум Адити
источник
2
Это потому, что он предназначен для использования в интерактивной оболочке. Так что, даже если вы хотите диалог, sys.exit()следует использовать внутри программ.
TheTechRobo36414519