Python 程式退出處理器 (atexit)


Python 標準發行版中的 atexit 模組有兩個函式 - register() 和 unregister()。這兩個函式都接受一個現有的函式作為引數。註冊的函式在直譯器會話正常終止時自動執行。

如果註冊了多個函式,則它們的執行順序與註冊順序相反。這意味著,如果依次註冊函式 f1()、f2() 和 f3(),則它們的執行順序將是 f3()、f2() 和 f1()。

unregister() 函式從要自動呼叫的函式列表中刪除指定的函式。

以下程式碼演示瞭如何在程式碼終止時註冊一個函式以進行自動執行。(注意:此程式碼必須從命令列執行,而不是透過 IDLE 執行)。程式要求使用者依次輸入數字並將其相加。迴圈結束後,註冊的函式 savetotal() 會自動被呼叫以將總和儲存到檔案中。

import atexit
sum = 0
def savetotal():
fo = open("atexit.txt","w")
fo.write(str(sum))
print ("sum written to file")
fo.close()
atexit.register(savetotal)
while True:
n = int(input("enter a number. -1 to exit"))
if n == -1:
break
sum = sum + n
print (sum)

將以上程式碼儲存為 atexit-example.py 並從命令列執行。輸入的連續數字會被加起來,並在最後將總和寫入 atexit.txt 檔案。

C:\python36>python atexit-example.py
enter a number. -1 to exit4
enter a number. -1 to exit6
enter a number. -1 to exit3
enter a number. -1 to exit5
enter a number. -1 to exit2
enter a number. -1 to exit-1
20
sum written to file

atexit.txt 檔案將建立在當前目錄中,並且它將儲存總和(在本例中為 20)。

也可以使用不同的引數註冊函式。在這種情況下,每個引數的函式將被獨立註冊,並按註冊順序的相反順序執行。

import atexit
names = ['Ashok', 'Radha', 'Abdul', 'John']
def hello(name):
print ("Hello",name)
for name in names:
atexit.register(hello,name)

輸出

C:\python36>python atexit-example2.py
Hello John
Hello Abdul
Hello Radha
Hello Ashok

atexit.unregister(hello) 將從函式列表中刪除所有具有各種引數的 hello() 副本。

裝飾器語法

註冊函式的一種便捷替代方法是使用 register() 函式作為裝飾器。

import atexit
@atexit.register
def hello():
print('Hello World!')
print('Say Hello')

輸出

C:\python36>python atexit-example3.py
Say Hello
Hello World!

如果程式意外終止或呼叫了 os.exit() 函式,則註冊的函式將不會自動呼叫。

atexit 模組可用於自動執行清理操作,例如關閉資料庫和檔案、釋放資源等。

更新於: 2020-06-27

576 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告