Python中的exit()和sys.exit()的区别

在Python中,有两个名称相似的函数,exit()sys.exit()。有什么不同,什么时候我应该用一个比另一个?

344567 次浏览

exit是交互式shell的帮助器——sys.exit用于程序中。

site模块(在启动时自动导入,除非给出了-S命令行选项)向内置命名空间(例如exit)添加了几个常量。它们对于交互式解释器shell很有用,不应该在程序中使用


从技术上讲,它们做的基本相同:引发SystemExitsys.exit< em > sysmodule.c < / em >中这样做:

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中运行它,它会显示一条消息,询问我是否要终止程序。真让人不安。 在这里看到的 < / p >

但是在这种情况下sys.exit()更好。它会关闭程序并且不创建任何对话框。

解,起源,差异速度

为什么我们需要exit() / sys.exit()命令吗?< / h2 >

通常情况下,代码会一直运行到最后,程序会自动存在。 有时,我们会要求程序在整个周期运行之前关闭。 一个例子是,当你实现身份验证时,一个用户身份验证失败,在某些情况下,你想退出程序

exit()

Python退出。

也许你不知道这一点,但它是quit()的同义词,并且添加在quit()之后,以使python更加用户友好。

< >强用法: 使用内置exit()开箱即用,不需要导入任何库。 只要输入这个:

exit()

执行时间:0.03秒

优点:

  • 使用速度更快(内置)
  • 适用于python 2。X和python 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异常
  • 您可以使用异常消息
  • 关闭时没有对话框
  • 利用tryfinally子句
  • 适用于python 2。X和python 3.x

缺点:

  • 需要导入
  • exit()慢57.1%

结论:

如果你不需要一个带有可选消息的异常,那么使用exit(),这是更快和内置的。 如果你需要一个带有可选消息的异常的更多功能,使用sys.exit().

在代码示例中,我使用的是Python 3.x