Normalde PyInstaller bir python dosyasında bulunan bütün import
ifadelerini yakalar ve programda kullanılacak diğer python dosyalarının içinde bulunan kodları dondurarak binary dosyalarını oluşturur.
Örnek:
İsmi main.py
olan bir dosyamız var diyelim. Bu dosyanın içinde de aşağıdakiler yazılı olsun.
import kutuphane
print(kutuphane.degisken)
main.py
dosyasından bir executable
dosya oluştururken, PyInstaller gider, kutuphane
dosyasının mevcut olup olmadığına bakar. Mevcutsa bu dosyadan da bir binary dosyası oluşturur.
kutuphane.py
dosyasında şunlar yer alıyor olsun:
degisken = 1
Şimdi ben bu main.py
’yi kullanarak çalıştırılabilir dosya oluşturursam, dosya oluştuktan sonra da kutuphane.py
’yi dosyanın bulunduğu dizine atsam ve degisken
isimli değişkenin değerini 10
yapıp, çalıştırılabilir dosyayı çalıştırsam ekrana 1
yazısı yazdırılır. Çünkü yukarıdaki bahsettiğim gibi, PyInstaller, kutuphane.py
dosyasının içindeki kodu kullanacaktır, benim main
’in yanına attığım kutuphane.py
dosyasını değil.
Ancak main
dosyasını çalıştırdığım zaman kutuphane.py
dosyasında yapılacak değişikliğe göre bir sonuç almak istiyorsam aşağıdaki yolu izleyebilirim.
kutuphane.py
’nin ismini şimdilik a.py
yapıyorum. Ve main.py
dosyasından yeniden çalıştırılabilir bir dosya üretmeye çalışıyorum.
Oluşan main
dosyasını çalıştırdığımda şöyle bir hata almam lazım.
Traceback (most recent call last):
File "main.py", line 4, in <module>
ModuleNotFoundError: No module named 'kutuphane'
[19061] Failed to execute script main
İsmini a.py
olarak değiştirdiğim dosyayı alıp, main
dosyasının yanına koyuyorum ve main
’i tekrar çalıştırıyorum. Bu sefer ekrana 1
yazılıyor. kutuphane.py
dosyasındaki degisken
isimli değişkenin değerini değiştirdiğim zamanda da yeni değer ekrana yazılıyor.
Yani özetle, python programlarınızı çalıştıracak olan ana dosyanızı, import
edeceği diğer dosyaların yanından uzaklaştırın. Ve bu ana dosyadan çalıştırılabilir bir dosya oluşturun. Güncelleme işlemi diğer dosyalar üzerinde gerçekleşsin. Dosyaların içeriklerinin değişiyor olması sorun oluşturmayacaktır yeter ki isimler de bir değişiklik olmasın.