exit、quit、sys.exit、os._exit,这么多退出方式,它们之间有什么区别呢?

简介: exit、quit、sys.exit、os._exit,这么多退出方式,它们之间有什么区别呢?

如果我们想主动退出 Python 程序,那么可以使用 exit, quit, sys.exit, os._exit 这四个函数,而这些函数之间有什么区别呢?


首先来说前三个,exit, quit, sys.exit 退出程序的原理是一样的,只不过 exit 和 quit 用在交互式环境中,sys.exit 用在非交互式环境中。当然啦,无论是交互式还是非交互式,这三个函数都是适用的。


至于这个三个函数所做的事情,实际上就是 raise 一个 SystemExit 异常。如果我们没有捕获这个异常,那么程序就会退出。

import sys
sys.exit(100)
print("程序退出,这里不会打印")

当执行 sys.exit 的时候,会抛出 SystemExit,这里我们没有捕获它,所以程序会退出。并且函数接收一个整数,表示程序退出时的状态码。


c5129f36c4557ca797fe37c3e68c6fed.png

这里我用的 PyCharm,结尾会显示程序退出时的状态码,可以看到结果是我们设置的 100。一般来说,如果程序正常退出,那么状态码为 0;程序执行出错,状态码为 1。当然啦,如果是解释器执行时内部出问题了,那么会抛出像下面这种乱七八糟的状态码。


e7f61508a2b9d511746ebe075c09e455.jpg

不过这种情况基本只有在写 C 扩展的时候才会遇到。


我们说 quit, exit, sys.exit 都可以接收一个整数,表示退出时的状态码,但如果接收的不是整数呢?那么会将参数作为打印信息输出到 stderr(标准错误输出)中,然后退出程序,并且状态码为 1。

import sys
sys.exit("我退出啦")

我们执行一下:


这三个函数的工作原理是 raise 一个 SystemExit 异常,那如果将其捕获了,程序是不是就不退出了,答案是肯定的。

import sys
try:
    sys.exit(100)
except SystemExit:
    print("程序想要退出,但被捕获了")
print("正常打印")

执行一下,看看结果。


3ba8c8ed38efe5e14edf5bfbfd05c257.png

结果确实如我们所料,将 sys.exit 引发的异常捕获掉之后,程序正常执行。所以最后状态码是 0,因为程序是正常结束的。


那么问题来了,我们能不能手动抛一个 SystemExit 呢?

print("我要抛异常了")
raise SystemExit(666)
print("此处不会执行")

SystemExit 里面也可以接收一个整数,会作为状态码返回;如果接收的不是整数,那么会将参数作为打印信息输出到 stderr 当中,并且状态码为 1。


dd7e2c39a1a283c7f0266fcaccb35d30.png


和 sys.exit 的表现是一样的,因为 sys.exit 本质上就是 raise 一个 SystemExit。并且我们看到在 raise SystemExit 的时候,并没有出现异常回溯栈,或者说没有看到 Traceback (most recent call last): 这样的字眼。

所以说 SystemExit 是不像异常的异常,因为没有任何的错误信息出现。
并且注意:SystemExit 继承自 BaseException,不是 Exception。


因此结论很清晰了,sys.exit 是通过引发 SystemExit 异常来退出程序的,我们可以捕获此异常做一些清理工作,甚至可以阻挠程序退出。当然,quit 和 exit 这两个内置函数也是同样的工作原理,只不过它们一般用在交互式环境中,但非交互式环境也能用。

try:
    exit("我想退出")
except SystemExit:
    print("exit,别做梦了")
try:
    quit("我想退出")
except SystemExit:
    print("quit,别做梦了")
exit("这下我真的退出了")

看一下打印结果:


d52597474ca96fa3d763463a4f6cebcb.png

最后一个 exit 没有异常捕获,因此程序退出,并且由于接收的参数不是整数,那么会将参数作为打印信息输出到 stderr 中,退出的状态码为 1。


前面三个退出函数我们就说完了,再来看看最后一个,也就是 os._exit。它就比较厉害了,在底层会调用 C 语言的 exit 函数,相当于强制退出。

import os
try:
    os._exit(666)
except Exception:
    print("会打印吗")
print("会打印吗")

下面的 print 会执行吗?执行一下看看。


6aa946fbb3375d72cb6bd5995319270b.png

并没有执行,因此 os._exit 属于强制退出,无法被阻止。因此它一般用于子进程的退出,我们在主进程中退出的话一般使用 sys.exit。


最后 os._exit 还有一个不同的地方,就是它必须接收一个整数作为退出时的状态码,否则报错。

import os
try:
    os._exit("xx")
except TypeError as e:
    print(e)
print("正常执行")
"""
an integer is required (got type str)
正常执行
"""

此时程序是可以正常执行下去的,因为 os._exit 接收的参数类型不对,导致该函数并没有执行,而是直接抛出了 TypeError。


以上就是这几个退出函数之间的区别。

相关文章
|
5月前
|
安全 Android开发 数据安全/隐私保护
请说明鸿蒙操作系统与其他操作系统(如Android和iOS)的主要区别。
请说明鸿蒙操作系统与其他操作系统(如Android和iOS)的主要区别。
216 1
|
4月前
|
存储 调度 C++
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
88 1
|
5月前
|
弹性计算 运维 安全
阿里云服务器Windows和Linux操作系统区别对比
阿里云服务器Windows和Linux操作系统区别对比,性能有差异吗?有,同配置下Linux性能要优于Windows,但这与阿里云无关,仅仅是linux和windows之间的区别。另外,阿里云提供的windows和linux操作系统均为正版授权,用户不需要额外支付许可费用,如何选择?看用户自己的应用程序情况。
|
5月前
|
人机交互 调度 Windows
操作系统的概念、并发和并行的区别、操作系统的发展和分类
操作系统的概念、并发和并行的区别、操作系统的发展和分类
73 2
|
5月前
|
安全 Java Linux
手机操作系统和嵌入式操作系统的区别和联系
手机操作系统和嵌入式操作系统的区别和联系
|
5月前
|
运维 安全 Linux
使用阿里云搭建幻兽帕鲁服务器操作系统类型Windows和Linux有区别吗?
使用阿里云搭建幻兽帕鲁服务器操作系统类型Windows和Linux有区别吗?性能有差异?同配置的游戏服务器,如4核16G或8核32G配置等,选择Windows和Linux操作系统差异不太大,如果非要对比的话,Linux系统相对Windows更少占用计算资源,当然如果对Linux不熟悉的话,可以选择Windows。另外,即便是幻兽帕鲁服务器创建成功后,也是可以免费修改操作系统的
194 1
|
11月前
|
存储 算法 Java
深入理解操作系统中进程与线程的区别及切换机制(下)
本文首先介绍了进程的控制结构,即进程控制块(PCB),它是表示进程的数据结构,包含了进程的相关信息和资源。PCB之间通过链表连接,形成就绪队列和阻塞队列,用于进程调度和资源管理。接着,文章详细探讨了进程的切换过程。进程切换是为了保证公平分配CPU时间片,涉及保存和恢复进程的执行上下文、更新进程状态和调度算法选择等步骤。文中还提到了进程上下文切换的场景,如时间片用完、内存不足、高优先级进程需求等。最后,文章介绍了线程的概念和上下文切换过程。线程是进程中的独立执行流程,可以共享进程的资源。线程的上下文切换开销较小,只需要保存和恢复线程的寄存器和计数器等信息。
233 0
深入理解操作系统中进程与线程的区别及切换机制(下)
|
11月前
|
Java 调度
深入理解操作系统中进程与线程的区别及切换机制(上)
进程是正在运行的程序的实例,它可以包含一个或多个线程。我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。就绪状态表示进程已经准备好运行,但还没有被调度执行。运行状态表示进程正在执行。阻塞状态表示进程被阻塞,需要等待某些事件的发生才能继续执行。结束状态表示进程已经完成执行。
深入理解操作系统中进程与线程的区别及切换机制(上)
|
11月前
|
IDE 开发工具 Python
python exit() sys.exit() os._exit()区别
python exit() sys.exit() os._exit()区别
42 0
|
2月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。