ÖNEMLİ! Temel Python bilgisine sahip olduğunuz farz edilerek yazılmıştır
Atexit mantığının temelinde bir program kapanırken yapılacağı işlemleri bir listeye ekleyip bunları çalıştırır.
.register:
Senaryoya göre elimizde bir program olsun, bu program işlemi bitirince biz bir işlem yapmasını istiyoruz. Örnek kodlarımız şu şekilde olsun
import atexit print("Merhaba") def sonlandir(): print("Son ayarlar yapılıyor...") atexit.register(sonlandir)
0x00
Şimdi biz burada program kapanırken “son ayarlar yapılıyor” demesini istedik ve bunu da register ile sağladık. Register kabaca bir “kapanırken yapılacaklar listesi” oluşturur ve bunu çalıştırır. Çalıştıralım
root@kali:~/Masaüstü# python3 son.py Merhaba Son ayarlar yapılıyor..
0x01
Gördüğünüz gibi kali terminal’i gayet rahat çalıştırdı programı. Bir de IDE üzerinden deneyelim
Merhaba >>>
0x02
Gördüğümüz gibi çıkışta yapılacağı işlemi çalıştırmadı. Bu durumda yardımımıza “atexit._run_exitfuncs()” koşuyor…
._run_exitfuncs:
Adından da anlaşılacağı gibi çıkışta yapılacak fonksiyon listesini çalıştırır. Örnek bir kodlama ile gösterirsek…
import atexit print("Merhaba") def sonlandir(): print("Son ayarlar yapılıyor...") atexit.register(sonlandir) atexit._run_exitfuncs()
0x03
Tabii ki biz kullandığımızda programımız bu kadar basit olmayacak. Mesela parametreli kullanmamız gerekecek. Bunun için önce bir liste oluşturup parametre öğelerini o listeye eklememiz gereklidir. Örnek olarak:
import atexit print("Merhaba") a = [] def bitir(isim,soyisim): parms = (isim, soyisim) print("Temizlik yapildi") print("coder: {} aka: {}".format(*parms)) while 1: s = input(">>> ") if s == "exit": break else: a.append(s) atexit.register(bitir, a[0], a[1]) atexit._run_exitfuncs()
0x04
Çalıştıralım…
Merhaba >>> hackno >>> utku >>> exit Temizlik yapildi coder: hackno aka: utku >>>
0x05
.unregister:
Bazen koşula göre eklediğimiz işlemi silmemiz gerekebilir. Bu durumlarda “unregister()” den faydalanırız.
Register’in yaptığı işlemin tam tersini yapar. İki adet finish fonksiyonu üzerinden örneklendirelim
import atexit print("Merhaba") a = [] def bitir(): print("Bitti!") def bitir2(): print("Nereye gidiyorsun?") atexit.register(bitir) atexit.register(bitir2) soru = int(input("1 mi 2 mi: ")) if soru == 1: atexit.unregister(bitir2) elif soru == 2: atexit.unregister(bitir) atexit._run_exitfuncs()
0x06
Bunun çıktısı ise beklendiği üzere:
Merhaba 1 mi 2 mi: 1 Bitti! >>>
0x07
Ne zaman çalışmaz?
Python’ın tespit edemediği bir şekilde kapandığında veya benzeri bir durum oluştuğunda çalışmaz. Şimdi CTRL+C Kısayolu ile kapatmayı deneyelim
Merhaba 1 mi 2 mi: Traceback (most recent call last): File "C:\Users\Utku\AppData\Local\Programs\Python\Python35\bittiginde.py", line 11, in <module> soru = int(input("1 mi 2 mi: ")) File "C:\Users\Utku\AppData\Local\Programs\Python\Python35\lib\idlelib\PyShell.py", line 1386, in readline line = self._line_buffer or self.shell.readline() KeyboardInterrupt >>>
0x08
Başka bir güzel özelliği ise, oldukça sade yazılmış bir kütüphane olması. Kaynak kodlarına göz atacak olursak
""" atexit.py - allow programmer to define multiple exit functions to be executed upon normal program termination. One public function, register, is defined. """ __all__ = ["register"] import sys _exithandlers = [] def _run_exitfuncs(): """run any registered exit functions _exithandlers is traversed in reverse order so functions are executed last in, first out. """ exc_info = None while _exithandlers: func, targs, kargs = _exithandlers.pop() try: func(*targs, **kargs) except SystemExit: exc_info = sys.exc_info() except: import traceback print >> sys.stderr, "Error in atexit._run_exitfuncs:" traceback.print_exc() exc_info = sys.exc_info() if exc_info is not None: raise exc_info[0], exc_info[1], exc_info[2] def register(func, *targs, **kargs): """register a function to be executed upon normal program termination func - function to be called at exit targs - optional arguments to pass to func kargs - optional keyword arguments to pass to func func is returned to facilitate usage as a decorator. """ _exithandlers.append((func, targs, kargs)) return func if hasattr(sys, "exitfunc"): # Assume it's another registered exit function - append it to our list register(sys.exitfunc) sys.exitfunc = _run_exitfuncs if __name__ == "__main__": def x1(): print "running x1" def x2(n): print "running x2(%r)" % (n,) def x3(n, kwd=None): print "running x3(%r, kwd=%r)" % (n, kwd) register(x1) register(x2, 12) register(x3, 5, "bar") register(x3, "no kwd args")