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


当前回答

如果我在代码中使用exit()并在shell中运行它,它会显示一条消息,询问我是否要终止程序。真让人不安。 在这里看到的

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

其他回答

解决方案,起源,差异和速度

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

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

exit ()

Python退出。

也许你不知道这一点,但它是quit()的同义词,在quit()之后添加,以使python更加用户友好。 设计用于使用交互式shell。

用法: 就像开箱即用一样使用内置的exit(),不需要导入任何库。 只要输入这个:

exit()

执行时间:0.03秒

优点:

使用速度更快(内置) 适用于python 2。X和python 3.x 快 可以像sys.exit()一样使用(有例外)

缺点:

无异常消息

sys.exit ()

退出Python并引发SystemExit异常(需要导入)。 设计用于程序内部工作。

用法:

import sys
sys.exit()

执行时间(仅为import和sys.exit()): 0.07秒

或者你可以为SystemExit异常使用一条消息:

最后增加了块说明代码清理子句。灵感来自@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异常 您可以使用异常消息 关闭时没有对话框 最后运用尝试条款 适用于python 2。X和python 3.x

缺点:

需要导入 比exit()慢57.1%

结论:

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

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

如果我在代码中使用exit()并在shell中运行它,它会显示一条消息,询问我是否要终止程序。真让人不安。 在这里看到的

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

Exit是交互式shell - sys的一个助手。Exit用于程序中。

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


从技术上讲,它们的功能基本相同:提升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和_sitebuiltin .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()之后的子进程中使用)。