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

Jon*_*han 435 python

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

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

iCo*_*dez 693

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

  1. quit()引发SystemExit幕后异常.

    此外,如果你打印它,它会给出一个信息:

    >>> print (quit)
    Use quit() or Ctrl-Z plus Return to exit
    >>>
    
    Run Code Online (Sandbox Code Playgroud)

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

    然而,quit应该不是在生产代码中使用.这是因为它仅在site加载模块时有效.相反,此功能只应在解释器中使用.

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

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

    >>> print (exit)
    Use exit() or Ctrl-Z plus Return to exit
    >>>
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    然而,与那两者不同,sys.exit在生产代码中被认为是好的.这是因为sys模块将始终存在.

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

    请注意,在给出的四种方法中,只有这一种方法具有独特之处.

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


或者,在我看来,甚至更好,你可以直接做sys.exit幕后操作并运行:

raise SystemExit
Run Code Online (Sandbox Code Playgroud)

这样,您无需先导入sys.

然而,这种选择只是一种风格,完全取决于你.

  • `sys.exit()`不是一种可靠的关闭方式.如果在线程内部调用它,它将仅终止该线程,除非它在主线程中.这可能导致程序继续运行的很多情况,因为调用不在主线程中,特别是因为一些解释器将无形地线程调用. (4认同)
  • @BrianBurns:不值得添加专用语法并保留另一个关键字。这类似于为什么将“ print”从语句更改为函数的原因。添加语法很容易,但是这样做会增加复杂性。 (4认同)
  • 即使 sys 库在某些受限的 Python 环境中不可用,`raise SystemExit` 也很棒 (4认同)
  • 但是在ipython shell中,`quit`和`exit`退出shell,而`sys.exit`却没有. (2认同)
  • 我投票支持添加一个 `end` 命令,它会 `raise SystemExit`。不明白为什么不能有像 BASIC 那样简单的东西。 (2认同)

Die*_*Epp 90

函数* quit(),exit()sys.exit()函数以相同的方式运行:它们引发SystemExit异常.因此,有没有真正的区别,不同之处在于sys.exit()始终可用,但exit()quit()是唯一可用的,如果site模块是进口的.

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

结论

  • 使用exit()quit()在REPL中.

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

  • 使用os._exit()子进程在通话结束后退出os.fork().

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

脚注

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


小智 43

Different Means of Exiting

os._exit():

  • Exit the process without calling the cleanup handlers.

exit(0):

  • a clean exit without any errors/problems.

exit(1):

  • There was some issue/error/problem and that is why the program is exiting.

sys.exit():

  • When the system and python shuts down; it means less memory is being used after the program is run.

quit():

  • Closes the python file.

Summary

Basically they all do the same thing, however, it also depends on what you are doing it for.

I don't think you left anything out and I would recommend getting used to quit() or exit().

你会使用sys.exit(),os._exit()主要是你使用大文件或使用python来控制终端.

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

  • 还有`exit("Here is Why the program failed")`,它打印错误消息并退出并返回状态`1`。 (4认同)
  • “_否则主要使用 exit() 或 quit()._” 尽管[文档](https://docs.python.org/3/library/constants.html#constants-added-by-the-site-module )指出“它们对于交互式解释器 shell 很有用,**不应该在程序中使用**。”? (3认同)

oef*_*efe 40

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

内部sys.exit只是加注SystemExit.然而,呼叫sys.exitSystemExit直接提高更惯用.

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

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

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$
Run Code Online (Sandbox Code Playgroud)

这基本上只是一个利用解释器打印__repr__您在提示符处输入的任何表达式的事实的hack .