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

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

【问题讨论】:

    标签: python 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

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2023-04-02
      • 2016-12-08
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多