python 中 os._exit(), sys.exit(), exit() 的区别是什么?

python 中 os._exit(), sys.exit(), exit() 的区别是什么?

退出方式不一样( exit()和sys.exit()会raise SystemExit(code), os._exit()直接退出。exit()基本只是在IDLE和命令行中使用)。

回答最下面有运行效果和源代码

sys.exitsysmodule.c中源代码是这样的(注意PyErr_SetObject(PyExc_SystemExit, exit_code);,这个操作相当于raise SystemExit(code):

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;
}

再来看看官方英文版原版解释:

sys.exit([arg])¶

Exit from Python. This is implemented by raising the SystemExit exception, so cleanup actions specified by finally clauses of try statements are honored, and it is possible to intercept the exit attempt at an outer level.

The optional argument arg can be an integer giving the exit status (defaulting to zero), or another type of object. If it is an integer, zero is considered “successful termination” and any nonzero value is considered “abnormal termination” by shells and the like. Most systems require it to be in the range 0–127, and produce undefined results otherwise. Some systems have a convention for assigning specific meanings to specific exit codes, but these are generally underdeveloped; Unix programs generally use 2 for command line syntax errors and 1 for all other kind of errors. If another type of object is passed, None is equivalent to passing zero, and any other object is printed to stderr and results in an exit code of 1. In particular, sys.exit("some Errormessage") is a quick way to exit a program when an error occurs.

Since exit() ultimately “only” raises an exception, it will only exit the process when called from the main thread, and the exception is not intercepted.

Changed in version 3.6: If an error occurs in the cleanup after the Python interpreter has caught SystemExit (such as an error flushing buffered data in the standard streams), the exit status is changed to 120.

os._exit(n)

Exit the process with status n, without calling cleanup handlers, flushing stdio buffers, etc.

Note
The standard way to exit is sys.exit(n). _exit() should normally only be used in the child process after a fork().

The following exit codes are defined and can be used with _exit(), although they are not required. These are typically used for system programs written in Python, such as a mail server’s external command delivery program.

Note
Some of these may not be available on all Unix platforms, since there is some variation. These constants are defined where they are defined by the underlying platform.

直接运行一下看效果(因为运行时把SystemExit给 catch 了,所以 Python 不会真正退出):

第一个:os._exit(0) ,os._exit()直接将python解释器退出,余下的语句不会执行。os._exit() 调用 C 语言的 _exit() 函数。相当于强制退出。

os._exit(0)

第二个:sys.exit(n) ,调用后会引发SystemExit异常,可以捕获此异常做清理工作。甚至可以阻止程序退出。

sys.exit(n)

第三个:exit()/quit(),这种实际上和sys.exit(n) 没有什么区别

exit()/quit()
#代码如下,可以运行一下看效果
import os,sys
#%% os._exit(0)
try:
    print('run:    os._exit(0) # os._exit(n), 直接退出, 不抛异常, 不执行相关清理工作. 常用在子进程的退出')
    os._exit(0) # os._exit(n), 直接退出, 不抛异常, 不执行相关清理工作. 常用在子进程的退出
except:
    print('except:xiaoyao_os._exit(0)_知乎:小尧') # 不运行
finally:
    print('xiaoyao_os._exit(0)quit_知乎:小尧') # 不运行
#%% sys.exit(n)
try:# 如果在 shell 里面用 try/except 包住这样写,实际上 shell 不会退出,因为 SystemExit 被 catch 了
    sys.exit('run:xiaoyao_sys.exit(4)_知乎:小尧') #  sys.exit(n) ,sys.exit(0)最终效果一样。sys.exit()  可以sys.exit("sorry, goodbye!"); 一般主程序中使用此退出.
except SystemExit:# 如果没有 except SystemExit ,程序就能正常退出。这边为了演示,加上 except SystemExit
    print('except:xiaoyao_sys.exit(4)_知乎:小尧')
finally:
    print('xiaoyao_sys.exit(4)quit_知乎:小尧')
#%% exit()/quit()
try:# 如果在 shell 里面用 try/except 包住这样写,实际上 shell 不会退出,因为 SystemExit 被 catch 了
    quit() # exit()/quit(), 跑出SystemExit异常. 一般在交互式shell中退出时使用.
except SystemExit:# 如果没有 except SystemExit ,程序就能正常退出。这边为了演示,加上 except SystemExit
    print('except:xiaoyao_exit()_知乎:小尧')
finally:
    print('xiaoyao_exit()quit_知乎:小尧')
#%%
print('xiaoyao_能执行到这里?知乎小尧觉得不可能吧?')
'''
python3运行环境:
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
[Clang 6.0 (clang-600.0.57)] on darwin,知乎回答 written by 小尧
Type "help", "copyright", "credits" or "license" for more information.
退出代码是告诉解释器的(或操作系统)
link : https://www.zhihu.com/question/21187839/answer/569180438
'''

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342