Python中exit()和sys.exit()的区别
在Python中,有两个名字很相似的函数,分别是exit()
和sys.exit()
。它们有什么区别,什么时候应该使用其中一个呢?
3 个回答
解决方案、起源、区别与速度
为什么我们需要 exit()
/ sys.exit()
命令?
通常情况下,代码会一直运行到最后,然后程序自动退出。不过,有时候我们希望程序在完成所有操作之前就关闭。比如,当你在做用户身份验证时,如果用户验证失败,有时你就想让程序直接退出。
exit()
这个命令用于退出Python。
也许你不知道,其实它和 quit()
是同一个意思,exit()
是在 quit()
之后添加的,目的是让Python更容易使用。它主要是为了在交互式环境中使用。
用法:
你可以直接使用内置的 exit()
,不需要导入任何库。只需输入:
exit()
执行时间:0.03秒
优点:
- 使用更快(内置的)
- 在Python 2.x和3.x中都可以使用
- 速度快
- 可以像
sys.exit()
一样使用(除了异常处理)
缺点:
- 没有异常消息
sys.exit()
这个命令也用于退出Python,但它会引发一个SystemExit异常(需要导入)。它是为了在程序内部使用而设计的。
用法:
import sys
sys.exit()
仅导入和 sys.exit()
的执行时间:0.07秒
你也可以为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和3.x中都可以使用
缺点:
- 需要导入
- 比
exit()
慢57.1%
总结:
如果你不需要异常和可选消息,那就用 exit()
,它更快且是内置的。如果你需要更复杂的异常处理和可选消息,就用 sys.exit()
。
在代码示例中,我使用的是Python 3.x
如果我在代码里用 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,它在退出时不会调用清理处理程序,也不会刷新标准输入输出缓冲区等(通常只在子进程中使用,特别是在调用 fork()
之后)。