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

Dra*_*uan 389 python exit

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

mik*_*iku 446

exit是交互式shell的帮助sys.exit程序- 旨在用于程序.

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


从技术上讲,他们大致相同:提高SystemExit.sys.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;
}
Run Code Online (Sandbox Code Playgroud)

虽然分别exitsite.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')
Run Code Online (Sandbox Code Playgroud)

请注意,有一个第三个退出选项,即os._exit,它在不调用清理处理程序,刷新stdio缓冲区等的情况下退出(并且通常只能在a之后的子进程中使用fork()).

  • @nobar,是的,但是你真的不想使用`from module import*`. (5认同)
  • 我怀疑退出(main())是一个常见的习语,因为人们不接受*不应该用于程序*note.除非使用[`-S`](http://docs.python.org/using/cmdline.html#cmdoption-S),否则它可以正常工作.使用`-S`使其工作的一种方法是指定`from sys import*`. (4认同)

Ram*_*iti 25

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

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

  • 这是因为它是为在交互式 shell 中使用而设计的。因此,即使您想要对话框,也应该在程序内部使用“sys.exit()”。 (6认同)

Sta*_*kin 12

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

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

通常,代码会逐行运行直到结束,然后程序自动退出。有时,我们想要求程序在完整周期运行之前关闭。一个示例情况是,当您实施身份验证并且用户未能通过身份验证时,在某些情况下您希望退出程序。

exit()

退出Python。

也许你不知道这一点,但它是 的同义词,是为了使 python 更加用户友好quit()而添加的。quit()设计用于与交互式 shell 配合使用。

用法:按原样 使用内置的exit()开箱即用,无需导入任何库。只需输入以下内容:

exit()
Run Code Online (Sandbox Code Playgroud)

执行时间:0.03s

优点:

  • 使用速度更快(内置)
  • 适用于 python 2.x 和 python 3.x
  • 快速地
  • 可以完全像使用sys.exit()(有例外)

缺点:

  • 无异常信息

sys.exit()

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

用法:

import sys
sys.exit()
Run Code Online (Sandbox Code Playgroud)

执行时间(仅导入和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
Run Code Online (Sandbox Code Playgroud)

输出:

这是一个出口!

在 3、2、1.. 中执行清理

优点:

  • 触发系统退出异常
  • 您可以使用异常消息
  • 关闭时不显示对话框
  • 利用finally子句try
  • 适用于 python 2.x 和 python 3.x

缺点:

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

结论:

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

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

  • 这个答案在很多层面上都是错误的。首先,`exit()` 也会引发 `SystemExit`。其次,你的绩效比较是不公平的。您不应该包含导入时间,除非您从未在代码中的其他任何地方使用“sys”模块,这是不可能的(其他模块也可能导入它)。不考虑导入时间,性能是相反的。另外,正如 @miku 的回答所说,你不应该仅仅因为它更短而在脚本中使用 `exit()`,它只适合在 REPL 中使用。有关更多详细信息:https://gist.github.com/nyuszika7h/f2a5962995ed1adb403d7d27b3e7950e (6认同)