В Python есть две функции с одинаковыми именами, exit()
и sys.exit()
. Какая разница и когда я должен использовать один над другим?
В Python есть две функции с одинаковыми именами, exit()
и sys.exit()
. Какая разница и когда я должен использовать один над другим?
Ответы:
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()
).
from module import *
.
Если я использую exit()
код и запускаю его в оболочке, он показывает сообщение, спрашивающее, хочу ли я убить программу или нет. Это действительно тревожит.
Посмотреть здесь
Но sys.exit()
лучше в этом случае. Он закрывает программу и не создает никаких диалоговых окон.
sys.exit()
следует использовать внутри программ.
-S
не используется. Способ заставить это работать даже с-S
указаниемfrom sys import *
.