为何要用sys.exit()退出?

2019年9月2日 / 3,258次阅读 / Last Modified 2020年1月16日
sys模块

Python有4个不同的退出程序的函数,exit(),quit(),os_exit()和本文要介绍的sys.exit()。exit()和quit()是一样的,它俩的功能基本上与sys.exit()一样,只有os._exit()有些简单粗暴。

exit和quit函数

这两个函数的作用,就是直接退出程序,可以带一个参数作为程序的返回码,如果不带参数,默认就是返回0.

xinlin@ubuntu:~/test$ python3 -q
>>> exit(111)
xinlin@ubuntu:~/test$ echo $?
111
xinlin@ubuntu:~/test$ python3 -q
>>> quit(222)
xinlin@ubuntu:~/test$ echo $?
222
xinlin@ubuntu:~/test$ python3 -q
>>> exit()
xinlin@ubuntu:~/test$ echo $?
0
xinlin@ubuntu:~/test$ python3 -q
>>> quit()
xinlin@ubuntu:~/test$ echo $?
0

这两个函数一般在交互式的python解释器中使用。其实它俩也会抛出SystemExit异常,因此说跟sys.exit()一样。

sys.exit()函数

sys模块的exit函数,通过抛出一个SystemExit异常来尝试结束程序,Python代码可以捕获这个异常来进行一些程序退出前的清理工作,也可以不退出程序。sys.exit函数同样可以带一个参数来作为程序的退出码,默认是0.

>>> import sys
>>> try:
...     sys.exit(101)
... except SystemExit as e:
...     print(repr(e))
...     print(str(e))
...
SystemExit(101)
101
>>>

看起来使用str()函数在except分支获取返回码,比较判断不同的返回码,并做响应的清理动作,是比较方便的(str与repr的区别)。另外一个细节,上面这段代码在Python解释器中执行,因为异常被捕获,所以不会导致解释器退出!

捕获了sys.exit()函数抛出的异常,处理之后,还要程序继续退出,就需要直接使用exit或quit函数。实践中,完整的使用sys.exit函数的逻辑应该是如下这样的代码:

import sys

def main():
    sys.exit(123)
    return

if __name__ == '__main__':
    try:
        main()
    except SystemExit as e:
        if str(e) == '123':
            print('---123---')
            exit(123)

一般在python脚本中都选择使用sys.exit函数退出程序,可以有个异常捕获机制来做清理扫尾的工作,程序会更加灵活健壮。

os._exit()函数

这个函数简单粗暴,就是直接退出python解释器,后面的代码都不执行了!一般程序不推荐使用这种退出方式。

补充一个细节:

在python线程中,使用sys.exit(包括exit和quit),都只能实现退出子线程,而不能退出主线程;如果在子线程中调用os._exit,可以实现整个程序的退出。

-- EOF --

本文链接:https://www.pynote.net/archives/1036

留言区

《为何要用sys.exit()退出?》有2条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    GUI程序真的很麻烦,如果再考虑共用核心代码,就更需要仔细的设计和编码。比如sys.exit函数,GUI程序应该就不能这样直接退出程序。 [回复]

  • 麦新杰

    用Exception不能捕获SystemExit异常 ,要使用BaseException,或者直接SystemExit。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top