Python退出命令-为什么要使用这么多?何时使用?


489

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

我错过了吗?它们之间有什么区别?您什么时候使用?


1
您已经错过了os.abort()
Daleks

Answers:


763

让我给他们一些信息:

  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
    >>>
    

    然而,像quitexit被认为是不好的产品代码使用,并应保留在解释使用。这是因为它也依赖于site模块。

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

    但是,与这两者不同的是,sys.exit在生产代码中很好地使用它。这是因为sys模块将始终存在。

  4. os._exit()退出程序而不调用清理处理程序,刷新stdio缓冲区等。因此,这不是退出的标准方法,仅应在特殊情况下使用。其中最常见的是在所创建的子进程中os.fork

    请注意,在给出的四种方法中,只有一种是唯一的。

总结起来,所有四种方法都退出程序。但是,前两个在生产代码中被认为不好用,最后一个是非标准的,肮脏的方式,仅在特殊情况下使用。因此,如果要正常退出程序,请使用第三个方法:sys.exit


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

raise SystemExit

这样,您无需先导入sys

但是,此选择只是样式上的一个,完全由您决定。


2
但在IPython的外壳,quitexit退出外壳,而sys.exit没有。

5
sys.exit()不是可靠的关闭方法。如果在线程内部调用它,则它将仅终止该线程,除非它在主线程中。这可能导致程序继续执行的许多情况,因为该调用不在主线程中,尤其是某些解释器会无形地调用线程。
Elliot

1
我投票赞成增加一条end命令raise SystemExit。不明白为什么不能像BASIC中那样简单。
布莱恩·伯恩斯

6
@BrianBurns:不值得添加专用语法并保留另一个关键字。这类似于为什么print从语句更改为函数的原因。添加语法很容易,但是这样做会增加复杂性。
user2357112支持Monica

1
通话时括号是否重要sys.exit()
lindhe

99

函数* 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()并且exit()是可调用的实例对象,但我认为这没关系给他们打电话的功能。


50

退出的不同方式

os._exit()

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

exit(0)

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

exit(1)

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

sys.exit()

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

quit()

  • 关闭python文件。

摘要

基本上他们都做相同的事情,但是,这还取决于您要做什么。

我认为您不会遗漏任何东西,建议您习惯quit()exit()

您将使用sys.exit()并且os._exit()主要是在使用大文件或使用python控制终端的情况下。

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


42

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

内部sys.exit只是提高SystemExit。但是,呼叫sys.exitSystemExit直接发起更为惯用。

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

quit并且exit仅用于提供一种简便的方法来退出Python提示符。这适用于新用户或不小心输入Python提示符而又不想知道正确语法的用户。他们可能会尝试输入exitquit。尽管这不会退出解释器,但它至少会发出一条消息,告诉他们出路:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.