koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da modülleri yeniden içe nasıl aktarırız?

Uzun süredir çalışan bir Python sunucum olsun ve sunucuyu yeniden başlatmadan bir dosyayı update etmek istediğimizi varsayalım. Bunu nasıl yapabiliriz? Örneğin Python’da modülleri içe aktarmanın tersi bir anahtar kelimemiz olsaydı (un-import gibi) aşağıdakini yapabilirdik:

if degisti_mi(foo.py):
    unimport foo  <-- bunu nasıl yapacağız?
    import foo
    myfoo = foo.Foo()

Importlib.reload() kullanarak zaten içe aktarılmış bir modülü yeniden yükleyebiliriz:

from importlib import reload  # Python 3.4+
import foo

while True:
    # bir takım işlemler.
    if degisti_mi(foo):
        foo = reload(foo)

Python 2’de yeniden yükleme yerleşik bir fonksiyondu. Python 3’te ise imp modülüne taşındı. Python 3.4’te importlib lehine kullanımdan kaldırıldı. 3 veya sonraki bir sonraki sürümler için reload çağırırken uygun bir modüle başvurmanız gerekir.

Django sunucusu gibi Web sunucuları bu yöntemi kullanır, böylece sunucu işleminin kendisini yeniden başlatılmadan kod değişikliklerinizin etkilerini görebilirsiniz.

Belgelerden alıntı yaparsak:

  • Python modülünün kodu yeniden derlenir ve modül düzeyi kodu yeniden yürütülür. Modül sözlüğündeki adlara bağlı yeni bir nesne kümesi tanımlanarak modülü ilk yükleyen yükleyiciyi yeniden kullanır. Uzantı modüllerinin init işlevi ikinci kez çağrılmaz.
  • Python’daki diğer tüm nesnelerde olduğu gibi, eski nesneler yalnızca başvuru sayıları sıfıra düştükten sonra geri kazanılır.
  • Modül ad alanındaki isimler, yeni veya değiştirilmiş nesnelere işaret etmek için güncellenir.
  • Eski nesnelere yapılan diğer başvurular (modül dışındaki adlar gibi) yeni nesnelere başvurmak için geri alınmaz ve istenirse oluştukları her ad alanında güncelleştirilmelidir.

Sorumuzda olduğu gibi, Foo objelerini eğer Foo sınıfı foo modülündeyse yeniden yapılandırmamız gerekir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top