1. 程式人生 > 實用技巧 >sys.exit()和os._exit()

sys.exit()和os._exit()

之前在程式中用sys.exit(0),無法立即退出當前程式,why?

原來是try進行了異常捕獲,當前函式停止了,但是之後的繼續執行:

import os,sys
import time
num=0
def fun():
    global num
    num +=1
    time.sleep(0.2)
    if num % 5 == 0:
        sys.exit(1)
        # os._exit(0)
    print("Now is ",num)

while True:
    try:
        fun()
    except:
        print(
"Occour error ")
Now is  1
Now is  2
Now is  3
Now is  4
Occour error 
Now is  6
Now is  7
Now is  8
Now is  9
Occour error 
Now is  11
Now is  12
Now is  13
Now is  14
Occour error 
Now is  16
Now is  17
Now is  18
Now is  19
Occour error 
Now is  21

不是預期的結果。

如果想要當前程式立馬停止,之後的全部停止,應該用os._exit()函式

import os,sys
import time
num=0
def fun():
    global num
    num +=1
    time.sleep(0.2)
    if num % 5 == 0:
        # sys.exit(1)
        os._exit(0)
    print("Now is ",num)

while True:
    try:
        fun()
    except:
        print("Occour error ")
Now is  1
Now is  2
Now is  3
Now is  4

os._exit()會直接將python程式終止,之後的所有程式碼都不會繼續執行。

sys.exit()會引發一個異常:SystemExit,如果這個異常沒有被捕獲,那麼python直譯器將會退出。如果有捕獲此異常的程式碼,那麼這些程式碼還是會執行。捕獲這個異常可以做一些額外的清理工作。0為正常退出,其他數值(1-127)為不正常,可拋異常事件供捕獲。

sys.exit()的退出比較優雅,呼叫後會引發SystemExit異常,可以捕獲此異常做清理工作。os._exit()直接將python直譯器退出,餘下的語句不會執行。

一般情況下使用sys.exit()即可,一般在fork出來的子程序中使用os._exit()

一般來說os._exit() 用於線上程中退出
sys.exit() 用於在主執行緒中退出。

exit() 跟 C 語言等其他語言的 exit() 應該是一樣的。
os._exit() 呼叫 C 語言的 _exit() 函式。

builtin.exit 是一個 Quitter 物件,這個物件的call方法會丟擲一個 SystemExit 異常。

exit(0)和exit(1)

exit(0):無錯誤退出
exit(1):有錯誤退出
退出程式碼是告訴直譯器的(或作業系統)