В Python есть две одинаково названные функции, exit()
и sys.exit()
. Какая разница и когда я должен использовать один над другим?
Разница между exit() и sys.exit() в Python
Ответ 1
exit
- помощник для интерактивной оболочки. sys.exit
предназначен для использования в программах.
Модуль
site
(который автоматически импортируется во время запуска, за исключением случаев, когда-S
командной строки-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 и т.д. (И которые обычно должны использоваться только в дочернем процессе после fork()
).
Ответ 2
Если я использую exit()
в коде и запускаю его в оболочке, он показывает сообщение о том, хочу ли я убить программу или нет. Это действительно тревожит. Посмотреть здесь
Но sys.exit()
лучше в этом случае. Он закрывает программу и не создает никакого диалогового окна.
Ответ 3
Это, по крайней мере, на холостом ходу...
-
exit
Выход и убивает программу с изображением этого. -
sys.exit
похож наbreak
внутри цикла, который просто останавливает код прямо там и не продолжается, все еще сохраняет python открытым.