Python:使用sys.exit或SystemExit的区别和建议

2024-05-17 06:34:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在线阅读有些程序员使用sys.exit,有些则使用SystemExit
对不起,基本问题是:

  1. 有什么区别?
  2. 什么时候需要在函数中使用SystemExit或sys.exit?

示例

ref = osgeo.ogr.Open(reference)
if ref is None:
    raise SystemExit('Unable to open %s' % reference)

或者

ref = osgeo.ogr.Open(reference)
if ref is None:
    print('Unable to open %s' % reference)
    sys.exit(-1)

Tags: tononerefifissysexitopen
2条回答

sys.exit(s)只是raise SystemExit(s)的简写,如前者的docstring中所述;请尝试help(sys.exit)。因此,您可以不使用任何一个示例程序

sys.exit('Unable to open %s' % reference)

除了提升SystemExit之外,还有3个退出函数。

底层的是os._exit,它需要1个int参数,并且不需要清除就立即退出。你不太可能想碰这个,但它就在那儿。

sys.exit是在sysmodule.c中定义的,只运行PyErr_SetObject(PyExc_SystemExit, exit_code);,这实际上等同于直接提升SystemExit。详细地说,提高SystemExit可能更快,因为sys.exit需要LOAD_ATTRCALL_FUNCTIONRAISE_VARARGS操作调用。另外,raise SystemExit生成的字节码稍小(少了4字节),(如果使用from sys import exit则额外生成1字节,因为sys.exit预期返回None,因此包含一个额外的POP_TOP)。

最后一个exit函数在site.py中定义,并在REPL中别名为exitquit。它实际上是Quitter类的一个实例(因此它可以有一个自定义的__repr__,因此可能是运行最慢的。另外,它在提升SystemExit之前关闭sys.stdin,因此建议仅在REPL中使用。

至于SystemExit是如何处理的,它最终会导致VM调用os.\u exit,但在此之前,它会进行一些清理。它还运行atexit._run_exitfuncs(),运行通过atexit模块注册的任何回调。调用os._exit直接绕过atexit步骤。

没有实际的区别,但是在您的示例代码中还有另一个区别-print转到标准输出,但是异常文本转到标准错误(这可能是您想要的)。

相关问题 更多 >