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



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

exit是交互式shell的助手-sys.exit用于程序中。

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


从技术上讲,他们的做法基本相同:提高SystemExitsys.exitsysmodule.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异常
  • 您可以使用异常消息
  • 关闭而不显示对话框
  • 使用tryfinally子句
  • 可与python 2.x和python 3.x一起使用

缺点:

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

结论:

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

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

最新更新