【问题标题】:Python exit commands - why so many and when should each be used?Python 退出命令 - 为什么要使用这么多以及何时应该使用每个命令?
【发布时间】:2013-11-13 20:53:20
【问题描述】:

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

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

【问题讨论】:

  • 你错过了os.abort()

标签: python


【解决方案1】:

不同的退出方式

os._exit():

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

exit(0):

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

exit(1):

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

sys.exit():

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

quit():

  • 关闭 python 文件。

总结

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

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

如果您使用大文件或使用 python 控制终端,则主要使用sys.exit()os._exit()

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

【讨论】:

  • "否则主要使用 exit() 或 quit()。" 尽管 documentation 声明“它们对交互式解释器 shell 很有用,不应该在程序中使用。”?
  • 还有exit("Here is why the program failed"),打印错误信息退出,返回状态1
【解决方案2】:

函数*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() 都是可调用的实例对象,不过我觉得把它们叫做函数也没问题。

【讨论】:

    【解决方案3】:

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

    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 一样,exit 被认为不适合在生产代码中使用,应保留用于解释器。这是因为它也依赖于site 模块。

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

      然而,与这两个不同的是,sys.exit 被认为很适合在生产代码中使用。这是因为sys 模块将一直存在。

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

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

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


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

    raise SystemExit
    

    这样,你不需要先导入sys

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

    【讨论】:

    • 但在 ipython shell 中,quitexit 退出 shell,而 sys.exit 不会。
    • sys.exit() 不是可靠的关闭方式。如果在线程内部调用它,它将只终止该线程,除非它在主线程中。这可能导致程序继续执行的很多情况,因为调用不在主线程中,尤其是在某些解释器会不可见的线程调用时。
    • 我投票赞成添加一个end 命令,该命令将raise SystemExit。不明白为什么没有像 BASIC 那样简单的东西。
    • @BrianBurns:不值得添加专用语法并保留另一个关键字。这类似于为什么 print 从语句更改为函数。添加语法很容易,但这样做有一定的复杂性。
    • raise SystemExit 很棒,即使 sys 库在某些受限的 python 环境中不可用
    【解决方案4】:

    sys.exit 是典型的退出方式。

    在内部sys.exit 只是提高了SystemExit。但是,调用 sys.exit 比直接调用 SystemExit 更惯用。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 2010-12-10
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2014-08-02
      • 2011-12-18
      相关资源
      最近更新 更多