在Python中,有两个名称相似的函数,exit()和sys.exit()。有什么不同,什么时候我应该用一个比另一个?
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和_sitebuiltin .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()并在shell中运行它,它会显示一条消息,询问我是否要终止程序。真让人不安。 在这里看到的
但是sys.exit()在这种情况下更好。它会关闭程序并且不创建任何对话框。
解决方案,起源,差异和速度
为什么我们需要exit() / sys.exit()命令吗?
通常情况下,代码会一直运行到最后,程序会自动存在。 有时,我们会要求程序在整个周期运行之前关闭。 例如,当您实现身份验证而用户身份验证失败时,在某些情况下您希望退出程序。
exit ()
Python退出。
也许你不知道这一点,但它是quit()的同义词,在quit()之后添加,以使python更加用户友好。 设计用于使用交互式shell。
用法: 就像开箱即用一样使用内置的exit(),不需要导入任何库。 只要输入这个:
exit()
执行时间:0.03秒
优点:
使用速度更快(内置) 适用于python 2。X和python 3.x 快 可以像sys.exit()一样使用(有例外)
缺点:
无异常消息
sys.exit ()
退出Python并引发SystemExit异常(需要导入)。 设计用于程序内部工作。
用法:
import sys
sys.exit()
执行时间(仅为import和sys.exit()): 0.07秒
或者你可以为SystemExit异常使用一条消息:
最后增加了块说明代码清理子句。灵感来自@Nairum。
import sys
try:
sys.exit("This is an exit!")
except SystemExit as error:
print(error)
finally:
print("Preforming cleanup in 3, 2, 1..")
# Do code cleanup on exit
输出:
这是出口! 预成型清理3,2,1 ..
优点:
触发SystemExit异常 您可以使用异常消息 关闭时没有对话框 最后运用尝试条款 适用于python 2。X和python 3.x
缺点:
需要导入 比exit()慢57.1%
结论:
如果你不需要一个带有可选消息的异常,那么使用exit(),这是更快和内置的。 如果需要带有可选消息的异常的更多功能,请使用sys.exit()。
在代码示例中,我使用的是Python 3.x
推荐文章
- 如何删除Python中的前导空白?
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?
- 使用Pandas将列转换为行
- 从matplotlib中的颜色映射中获取单个颜色
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?