601

似乎 python 支持许多不同的命令来停止脚本执行。
我发现的选择是: quit(), exit(), sys.exit(),os._exit()

我错过了吗?他们之间有什么区别?你什么时候使用每个?

4

4 回答 4

908

让我提供一些关于它们的信息:

  1. quit()只是引发了SystemExit异常。

    此外,如果您打印它,它会给出一条消息:

    >>> print (quit)
    Use quit() or Ctrl-Z plus Return to exit
    >>>
    

    包含此功能是为了帮助不了解 Python 的人。毕竟,新手尝试退出 Python 的最有可能的事情之一就是输入quit.

    尽管如此,quit不应生产代码中使用。这是因为它仅在site加载模块时才有效。相反,这个函数应该只在解释器中使用。

  2. exit()quit(反之亦然)的别名。它们一起存在只是为了使 Python 更加用户友好。

    此外,它在打印时也会给出一条消息:

    >>> print (exit)
    Use exit() or Ctrl-Z plus Return to exit
    >>>
    

    quit但是,likeexit被认为不适合在生产代码中使用,应该保留在解释器中使用。这是因为它也依赖于site模块。

  3. sys.exit()也引发了SystemExit异常。这意味着它quitexit在这方面相同。

    然而,与这两个不同的是,sys.exit它被认为可以很好地用于生产代码。这是因为sys模块将永远存在。

  4. os._exit()退出程序而不调用清理处理程序、刷新 stdio 缓冲区等。因此,它不是标准的退出方式,只能在特殊情况下使用。其中最常见的是由os.fork.

    请注意,在给出的四种方法中,只有这一种是独一无二的。

总结起来,所有四种方法都退出了程序。但是,前两种被认为不适合在生产代码中使用,最后一种是非标准的、肮脏的方式,仅用于特殊场景。所以,如果你想正常退出程序,请使用第三种方法:sys.exit.


或者,我认为更好的是,您可以直接sys.exit执行幕后操作并运行:

raise SystemExit

这样,您不需要先导入sys

但是,这种选择只是一种风格,完全取决于您。

于 2013-11-02T22:22:32.590 回答
122

函数* quit()exit()sys.exit()以相同的方式起作用:它们引发SystemExit异常。所以没有真正的区别,除了sys.exit()总是可用的,但exit()只有quit()site模块被导入时才可用。

os._exit()函数很特殊,它立即退出而不调用任何清理函数(例如,它不刷新缓冲区)。这是为高度专业化的用例设计的……基本上,只在孩子os.fork()打电话后。

结论

  • 在 REPL 中使用exit()或。quit()

  • sys.exit()在脚本中使用,或者raise SystemExit()如果您愿意。

  • 用于os._exit()子进程在调用 后退出os.fork()

所有这些都可以不带参数调用,或者您可以指定退出状态,例如,exit(1)raise SystemExit(1)以状态 1 退出。请注意,可移植程序仅限于 0-255 范围内的退出状态代码,如果您raise SystemExit(256)在许多系统上,这将被截断,您的进程实际上将以状态 0 退出。

脚注

*实际上,quit()andexit()是可调用的实例对象,但我认为将它们称为函数是可以的。

于 2013-11-02T22:22:20.640 回答
62

不同的退出方式

os._exit()

  • 退出进程而不调用清理处理程序。

exit(0)

  • 干净的退出,没有任何错误/问题。

exit(1)

  • 有一些问题/错误/问题,这就是程序退出的原因。

sys.exit()

  • 当系统和python关闭时;这意味着程序运行后使用的内存更少。

quit()

  • 关闭 python 文件。

概括

基本上他们都做同样的事情,但是,这也取决于你在做什么。

我认为您没有遗漏任何内容,我建议您习惯quit()or exit()

如果您使用大文件或使用 python 来控制终端,您将使用sys.exit()并且主要是。os._exit()

否则主要使用exit()or quit()

于 2013-11-02T22:10:38.363 回答
46

sys.exit是退出的规范方式。

内部sys.exit只是加注SystemExit。然而,跟注比直接sys.exit加注更惯用。SystemExit

os.exit是一个低级系统调用,直接退出而不调用任何清理处理程序。

quit并且exit存在只是为了提供一种摆脱 Python 提示的简单方法。这适用于新用户或意外进入 Python 提示符并且不想知道正确语法的用户。他们可能会尝试键入exitquit. 虽然这不会退出解释器,但它至少会发出一条消息,告诉他们一条出路:

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$

这本质上只是一个 hack,它利用解释器打印__repr__您在提示符下输入的任何表达式的事实。

于 2013-11-03T09:02:08.750 回答