【发布时间】:2011-09-23 23:22:05
【问题描述】:
在 Python 中,有两个名称相似的函数,exit() 和 sys.exit()。有什么区别,我应该什么时候使用一个而不是另一个?
【问题讨论】:
在 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 和_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() 之后的子进程中使用)。
【讨论】:
-S,否则它工作正常。即使使用-S 也能使其工作的一种方法是指定from sys import *。
from module import *。
如果我在代码中使用exit() 并在shell 中运行它,它会显示一条消息,询问我是否要终止该程序。这真的很令人不安。
See here
但sys.exit() 在这种情况下更好。它关闭程序并且不创建任何对话框。
【讨论】:
sys.exit() 也应该在程序内部使用。
exit() /
sys.exit() 命令?通常,代码会一直运行到最后,程序会自动存在。 有时,我们想要求程序在完整循环运行之前关闭。 例如,当您实施身份验证并且用户未能通过身份验证时,在某些情况下您想退出程序。
exit()
退出 Python。
也许你不知道,它是quit() 的同义词,被添加在quit() 之后,让python 更加用户友好。
旨在与交互式 shell 配合使用。
用法:
按原样使用内置的exit(),无需导入任何库。
只需输入:
exit()
执行时间:0.03s
优点:
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!
优点:
try 的finally 子句
缺点:
exit()慢57.1%
如果您不需要带有可选消息的异常,请使用exit(),它更快且内置。
如果您需要带有可选消息的异常的更多功能,请使用sys.exit()。
在代码示例中我使用的是 Python 3.x
【讨论】: