Python 退出命令 - 为什么有这么多命令以及何时应该使用?
- 2024-12-12 08:41:00
- admin 原创
- 129
问题描述:
python 似乎支持许多不同的命令来停止脚本执行。我发现的选择
是: quit()
`exit()sys.exit()
os._exit()`
我有没有遗漏什么?它们之间有什么区别?你什么时候会用到它们?
解决方案 1:
让我介绍一下它们:
quit()
只是引发SystemExit
异常。
此外,如果你打印它,它会显示一条消息:
>>> print (quit)
Use quit() or Ctrl-Z plus Return to exit
>>>
此功能是为了帮助不懂 Python 的人而提供的。毕竟,新手退出 Python 时最可能尝试输入quit
。
尽管如此,quit
不应在生产代码中使用。这是因为它仅在模块加载后才有效。site
相反,该函数应仅用于解释器中。
exit()
是 的别名quit
(反之亦然)。它们共存只是为了让 Python 更加用户友好。
此外,打印时也会显示一条消息:
>>> print (exit)
Use exit() or Ctrl-Z plus Return to exit
>>>
但是,像 一样quit
,exit
在生产代码中使用是不好的,应该保留在解释器中使用。这是因为它也依赖于模块site
。
sys.exit()
也会引发SystemExit
异常。这意味着它在这方面与quit
和exit
相同。
然而与上述两种不同的是,sys.exit
在生产代码中使用效果很好。这是因为sys
模块将始终存在。
os._exit()
退出程序而不调用清理处理程序、刷新 stdio 缓冲区等。因此,它不是退出的标准方式,只应在特殊情况下使用。其中最常见的是在由创建的子进程中os.fork
。
请注意,在给出的四种方法中,只有这一种方法的功能是独一无二的。
总结一下,这四种方法都可以退出程序。但是,前两种方法在生产代码中不太好用,最后一种方法是非标准的、肮脏的方法,只在特殊情况下使用。所以,如果你想正常退出程序,请使用第三种方法:sys.exit
。
或者,我认为更好的是,您可以直接执行sys.exit
幕后操作并运行:
raise SystemExit
这样,您就不需要sys
先导入。
然而,这种选择仅仅是一种风格,完全取决于您。
解决方案 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:
不同的退出方式
os._exit()
:
退出进程而不调用清理处理程序。
exit(0)
:
干净退出,没有任何错误/问题。
exit(1)
:
存在一些问题/错误/麻烦,这就是程序退出的原因。
sys.exit()
:
当系统和 Python 关闭时,这意味着程序运行后使用的内存更少。
quit()
:
关闭 python 文件。
概括
基本上它们都做同样的事情,但是,这也取决于你这样做的目的。
我认为您没有遗漏任何东西并且我建议您习惯quit()
或exit()
。
如果您使用大文件或者使用 python 来控制终端,那么您主要sys.exit()
会使用。os._exit()
否则主要使用exit()
或quit()
。
解决方案 4:
sys.exit
是退出的规范方式。
内部sys.exit
只是提高SystemExit
。但是,调用sys.exit
比SystemExit
直接提高更符合惯用做法。
os.exit
是一个低级系统调用,它直接退出,而不调用任何清理处理程序。
quit
和 的exit
存在只是为了提供一种简单的退出 Python 提示符的方法。这适用于新用户或不小心进入 Python 提示符并且不想知道正确语法的用户。他们可能会尝试输入exit
或quit
。虽然这不会退出解释器,但它至少会发出一条消息告诉他们退出的方法:
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$
__repr__
这本质上只是一个黑客攻击,利用了解释器打印您在提示符下输入的任何表达式的事实。