在Python中,有两个名称相似的函数,exit()
和sys.exit()
。有什么区别?我什么时候应该使用一个而不是另一个?
exit
是交互式shell的助手-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缓冲区等的情况下退出(通常只应在fork()
之后的子进程中使用)。
如果我在代码中使用exit()
并在shell中运行它,它会显示一条消息,询问我是否要终止程序。这真的很令人不安。参见此处
但sys.exit()
在这种情况下更好。它关闭程序,不创建任何对话框。
解决方案,起源,差异&速度
我们为什么需要exit()
/sys.exit()
命令
通常,代码会一直运行到最后,程序会自动退出。偶尔,我们会要求程序在整个周期运行之前关闭。一个示例是,当您实现身份验证,但用户无法进行身份验证时,在某些情况下,您希望退出程序。
exit()
退出Python。
也许你不知道这一点,但它是quit()
的同义词,是在quit()
之后添加的,目的是让python对用户更友好。设计用于处理交互式shell。
用法:按原样使用内置的exit()
,无需导入任何库。只需键入以下内容:
exit()
执行时间:0.03s
优点:
- 使用速度更快(内置)
- 可与python 2.x和python 3.x一起使用
- Fast
- 可以像
sys.exit()
一样使用(例外)
缺点:
- 无异常消息
sys.exit()
退出Python并引发SystemExit异常(需要导入)。设计用于程序内部工作。
用法:
import sys
sys.exit()
执行时间(仅导入和sys.exit()
):0.07s
或者,您可以使用SystemExit异常消息:
添加了finally
块来说明代码清理子句。灵感来自@Nairum
import sys
try:
sys.exit("This is an exit!")
except SystemExit as error:
print(error)
finally:
print("Preforming cleanup in 3, 2, 1..")
# Do code cleanup on exit
输出:
这是一个出口!
3、2、1.中的预成型清理
优点:
- 触发SystemExit异常
- 您可以使用异常消息
- 关闭而不显示对话框
- 使用
try
的finally
子句 - 可与python 2.x和python 3.x一起使用
缺点:
- 需要导入
- 比
exit()
慢57.1%
结论:
如果您不需要带有可选消息的异常,那么使用exit()
,这是更快且内置的。如果您需要具有可选消息的异常的更多功能,请使用sys.exit()
。
在代码示例中,我使用的是Python 3.x