Python中exit()和sys.exit()的区别
Posted
技术标签:
【中文标题】Python中exit()和sys.exit()的区别【英文标题】:Difference between exit() and sys.exit() in Python 【发布时间】:2011-09-23 23:22:05 【问题描述】:在 Python 中,有两个名称相似的函数,exit()
和 sys.exit()
。有什么区别,我应该什么时候使用一个而不是另一个?
【问题讨论】:
【参考方案1】:exit
是交互式 shell 的助手 - sys.exit
旨在用于程序中。
site
模块(在启动期间自动导入,除非给出了-S
命令行选项)向内置命名空间添加了几个常量(例如exit
)。 它们对于交互式解释器 shell 很有用,不应在程序中使用。
从技术上讲,他们的做法基本相同:提高 SystemExit
。 sys.exit
在 sysmodule.c 中这样做:
static PyObject *
sys_exit(PyObject *self, PyObject *args)
PyObject *exit_code = 0;
if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
return NULL;
/* Raise SystemExit so callers may catch it or clean up. */
PyErr_SetObject(PyExc_SystemExit, exit_code);
return NULL;
而exit
分别在site.py 和_sitebuiltins.py 中定义。
class Quitter(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return 'Use %s() or %s to exit' % (self.name, eof)
def __call__(self, code=None):
# Shells like IDLE catch the SystemExit, but listen when their
# stdin wrapper is closed.
try:
sys.stdin.close()
except:
pass
raise SystemExit(code)
__builtin__.quit = Quitter('quit')
__builtin__.exit = Quitter('exit')
请注意,还有第三个退出选项,即os._exit,它会在不调用清理处理程序、刷新 stdio 缓冲区等的情况下退出(通常只能在 fork()
之后的子进程中使用)。
【讨论】:
我怀疑 exit(main()) 是一个常见的习惯用法,因为人们不接受 should not be used in programs 注释。除非使用-S
,否则它工作正常。即使使用-S
也能使其工作的一种方法是指定from sys import *
。
@nobar,是的,但是你并不想使用from module import *
。
@EvgeniSergeev,我不确定你到底在问什么?这本身可能是一个有趣的问题。
如果在“with 语句”中使用三个退出函数中的任何一个会出现什么问题,这将是对这个答案的一个很好的补充。【参考方案2】:
如果我在代码中使用exit()
并在shell 中运行它,它会显示一条消息,询问我是否要终止该程序。这真的很令人不安。
See here
但sys.exit()
在这种情况下更好。它关闭程序并且不创建任何对话框。
【讨论】:
这是因为它是为在交互式 shell 中使用而设计的。所以即使你想要对话框,sys.exit()
也应该在程序内部使用。【参考方案3】:
解决方案、起源、差异和速度
为什么我们需要exit()
/
sys.exit()
命令?
通常,代码会一直运行到最后,程序会自动存在。 有时,我们想要求程序在完整循环运行之前关闭。 例如,当您实施身份验证并且用户未能通过身份验证时,在某些情况下您想退出程序。
exit()
退出 Python。
也许你不知道,它是quit()
的同义词,被添加在quit()
之后,让python 更加用户友好。
旨在与交互式 shell 配合使用。
用法:
按原样使用内置的exit()
,无需导入任何库。
只需输入:
exit()
执行时间:0.03s
优点:
使用更快(内置) 适用于 python 2.x 和 python 3.x 快速 可以像sys.exit()
一样使用(除了)
缺点:
无异常消息
sys.exit()
退出 Python 并引发 SystemExit 异常(需要导入)。 专为在程序内部工作而设计。
用法:
import sys
sys.exit()
执行时间(仅导入和sys.exit()
):0.07s
或者您可以使用 SystemExit 异常的消息:
import sys
try:
sys.exit("This is an exit!")
except SystemExit as error:
print(error)
输出:
This is an exit!
优点:
触发 SystemExit 异常 您可以使用异常消息 没有对话框就关闭 利用try
的finally
子句
适用于 python 2.x 和 python 3.x
缺点:
需要导入 比exit()
慢57.1%
结论:
如果您不需要带有可选消息的异常,请使用exit()
,它更快且内置。
如果您需要带有可选消息的异常的更多功能,请使用sys.exit()
。
在代码示例中我使用的是 Python 3.x
【讨论】:
以上是关于Python中exit()和sys.exit()的区别的主要内容,如果未能解决你的问题,请参考以下文章
python中 os._exit() 和 sys.exit(), exit和exit 的用法和区别
python中 os._exit() 和 sys.exit(), exit和exit 的用法和区别