atexit --- 退出處理器?


atexit 模塊定義了清理函數的注冊和反注冊函數. 被注冊的函數會在解釋器正常終止時執行. atexit 會按照注冊順序的*逆序*執行; 如果你注冊了 A, BC, 那么在解釋器終止時會依序執行 C, B, A.

注意: 通過該模塊注冊的函數, 在程序被未被 Python 捕獲的信號殺死時并不會執行, 在檢測到 Python 內部致命錯誤以及調用了 os._exit() 時也不會執行.

在 3.7 版更改: 當配合 C-API 子解釋器使用時,已注冊函數是它們所注冊解釋器中的局部對象。

atexit.register(func, *args, **kwargs)?

func 注冊為終止時執行的函數. 任何傳給 func 的可選的參數都應當作為參數傳給 register(). 可以多次注冊同樣的函數及參數.

在正常的程序終止時 (舉例來說, 當調用了 sys.exit() 或是主模塊的執行完成時), 所有注冊過的函數都會以后進先出的順序執行. 這樣做是假定更底層的模塊通常會比高層模塊更早引入, 因此需要更晚清理.

如果在 exit 處理程序執行期間引發了異常,將會打印回溯信息 (除非引發的是 SystemExit) 并且異常信息會被保存。 在所有 exit 處理程序獲得運行機會之后,所引發的最后一個異常會被重新引發。

這個函數返回 func 對象,可以把它當作裝飾器使用。

atexit.unregister(func)?

從解釋器關閉前要運行的函數列表中移除 func。 在調用 unregister() 之后,當解釋器關閉時會確保 func 不會被調用,即使它被多次注冊。 如果 func 之前沒有被注冊,unregister() 會靜默地不做任何操作。

參見

模塊 readline

使用 atexit 讀寫 readline 歷史文件的有用的例子。

atexit 示例?

以下簡單例子演示了一個模塊在被導入時如何從文件初始化一個計數器,并在程序終結時自動保存計數器的更新值,此操作不依賴于應用在終結時對此模塊進行顯式調用。:

try:
    with open("counterfile") as infile:
        _count = int(infile.read())
except FileNotFoundError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    with open("counterfile", "w") as outfile:
        outfile.write("%d" % _count)

import atexit
atexit.register(savecounter)

位置和關鍵字參數也可傳入 register() 以便傳遞給被調用的已注冊函數:

def goodbye(name, adjective):
    print('Goodbye, %s, it was %s to meet you.' % (name, adjective))

import atexit
atexit.register(goodbye, 'Donny', 'nice')

# or:
atexit.register(goodbye, adjective='nice', name='Donny')

作為 decorator: 使用:

import atexit

@atexit.register
def goodbye():
    print("You are now leaving the Python sector.")

只有在函數不需要任何參數調用時才能工作.