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

Posted

技术标签:

【中文标题】Python中exit()和sys.exit()的区别【英文标题】:Difference between exit() and sys.exit() in Python 【发布时间】:2011-09-23 23:22:05 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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


从技术上讲,他们的做法基本相同:提高 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(main()) 是一个常见的习惯用法,因为人们不接受 should not be used in programs 注释。除非使用-S,否则它工作正常。即使使用-S 也能使其工作的一种方法是指定from sys import * @nobar,是的,但是你并不想使用from module import * @EvgeniSergeev,我不确定你到底在问什么?这本身可能是一个有趣的问题。 如果在“with 语句”中使用三个退出函数中的任何一个会出现什么问题,这将是对这个答案的一个很好的补充。【参考方案2】:

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

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

【讨论】:

这是因为它是为在交互式 shell 中使用而设计的。所以即使你想要对话框,sys.exit() 也应该在程序内部使用。【参考方案3】:

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

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

通常,代码会一直运行到最后,程序会自动存在。 有时,我们想要求程序在完整循环运行之前关闭。 例如,当您实施身份验证并且用户未能通过身份验证时,在某些情况下您想退出程序。

exit()

退出 Python。

也许你不知道,它是quit() 的同义词,被添加在quit() 之后,让python 更加用户友好。 旨在与交互式 shell 配合使用。

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

exit()

执行时间:0.03s

优点:

使用更快(内置) 适用于 python 2.x 和 python 3.x 快速 可以像sys.exit()一样使用(除了)

缺点:

无异常消息

sys.exit()

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

用法:

import sys
sys.exit()

执行时间(仅导入和sys.exit()):0.07s

或者您可以使用 SystemExit 异常的消息:

import sys
try:
  sys.exit("This is an exit!")
except SystemExit as error:
  print(error)

输出:

This is an exit!

优点:

触发 SystemExit 异常 您可以使用异常消息 没有对话框就关闭 利用tryfinally 子句 适用于 python 2.x 和 python 3.x

缺点:

需要导入 比exit()慢57.1%

结论:

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

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

【讨论】:

以上是关于Python中exit()和sys.exit()的区别的主要内容,如果未能解决你的问题,请参考以下文章

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

python中 os._exit() 和 sys.exit(), exit和exit 的用法和区别

python中 os._exit() 和 sys.exit(), exit和exit 的用法和区别

Python3.x:os._exit(), sys.exit(), exit() 的区别

Python os._exit() sys.exit()

python中使用sys模块中sys.exit()好像不能退出?