atexit模組很簡單,只定義了一個register函數用於註冊程式退出時的回呼函數,我們可以在這個回呼函數中做一些資源清理的操作。
註:如果程式是非正常crash,或者通過os._exit()退出,註冊的回呼函數將不會被調用。
我們也可以通過sys.exitfunc來註冊回調,但通過它只能註冊一個回調,而且還不支援參數。所以建議大家使用atexit來註冊回呼函數。但千萬不要在程式中同時使用這兩種方式,否則通過atexit註冊的回調可能不會被正常調用。其實通過查閱atexit的源碼,你會發現原來它內部是通過sys.exitfunc來實現的,它先把註冊的回呼函數放到一個列表中,當程式退出的時候,按先進後出的順序調用註冊的回調。如果回呼函數在執行過程中拋出了異常,atexit會列印異常的文字資訊,並繼續執行下一下回調,直到所有的回調都執行完畢,它會重新拋出最後接收到的異常。
如果使用的python版本是2.6,還可以用裝飾器的文法來註冊回呼函數。
下面是一個例子,展示了atexit模組的使用:
import atexitdef exit0(*args, **kwarg): print 'exit0' for arg in args: print ' ' * 4, arg for item in kwarg.items(): print ' ' * 4, item def exit1(): print 'exit1' raise Exception, 'exit1'def exit2(): print 'exit2' atexit.register(exit0, *[1, 2, 3], **{ "a": 1, "b": 2, })atexit.register(exit1)atexit.register(exit2)@atexit.registerdef exit3(): print 'exit3'if __name__ == '__main__': pass
下面是程式啟動並執行結果,可以看到回呼函數執行的順序與它們被註冊的順序剛才相反。