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

542 投票
3 回答
367106 浏览
提问于 2025-04-16 20:25

在Python中,有两个名字很相似的函数,分别是exit()sys.exit()。它们有什么区别,什么时候应该使用其中一个呢?

3 个回答

13

解决方案、起源、区别与速度

为什么我们需要 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异常
  • 可以使用异常消息
  • 关闭时没有对话框
  • 可以利用 tryfinally
  • 在Python 2.x和3.x中都可以使用

缺点:

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

总结:

如果你不需要异常和可选消息,那就用 exit(),它更快且是内置的。如果你需要更复杂的异常处理和可选消息,就用 sys.exit()

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

58

如果我在代码里用 exit(),然后在命令行里运行它,系统会弹出一个提示,问我是否要结束这个程序。这真的很烦人。看看这里

但是在这种情况下,使用 sys.exit() 要好得多。它会直接关闭程序,不会弹出任何对话框。

602

exit 是一个帮助工具,主要用于交互式命令行;而 sys.exit 则是用在程序中的。

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


从技术上讲,它们的作用基本相同:都是引发 SystemExitsys.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() 之后)。

撰写回答