furkankank
Daha Önceden böle bir çalışmam olmadı ama aşağıdaki adımları kontrol ederek geri dönüş yapar mısınız ?
CHATGPT O1 Pro ile cevaplanmıştır:
Aşağıda, PyQt5 ile geliştirilen yüz tanıma uygulamasının .exe
haline getirildiğinde yaşanan “fotoğrafı kontrol etme aşamasında donma” sorununu gidermek için en sık karşılaşılan hata kaynaklarını ve bunların çözümlerini detaylı biçimde bulabilirsiniz. Bu adımları izleyerek uygulamanızın sorunsuz bir şekilde çalışmasını sağlayabilirsiniz.
1. PyInstaller Paketleme ve Yol (Path) Sorunları
1.1. Dinamik Dosya Yolları (Relative Paths) ve _MEIPASS
PyInstaller kullanıldığında, uygulama çalışırken paketlenmiş dosyalar gerçekte farklı bir klasör (_MEIPASS
) altına çıkarılır. Eğer kodunuzda resimlerinizi, veritabanınızı ya da modül konfigürasyon dosyalarınızı doğrudan proje klasörü üzerinden yüklüyorsanız, .exe
ortamında aynı klasör yapısı olmayacaktır.
Çözüm:
PyInstaller tarafından oluşturulan temp klasörünün (_MEIPASS
) konumunu tespit ederek oradaki dosyalarınızı çağırmalısınız. Örneğin:
import sys, os
if getattr(sys, 'frozen', False):
# PyInstaller ile paketlenmiş .exe dosyası çalışıyor
application_path = sys._MEIPASS
else:
# Python ortamında çalışıyor
application_path = os.path.dirname(__file__)
# Örnek: veritabanı dosya yolunu ayarlamak
db_path = os.path.join(application_path, "veritabani.db")
Fotoğraf şablonları veya model dosyaları da benzer şekilde application_path
altında aranmalıdır.
1.2. Gizli İçe Aktarımlar (Hidden Imports)
PyInstaller, bazı kütüphanelerin alt bağımlılıklarını otomatik olarak tarayamayabiliyor. Özellikle opencv-python
(cv2) veya dlib
, face_recognition
gibi kütüphanelerde gizli import sorunları sıklıkla yaşanır.
Çözüm:
PyInstaller komutunu çalıştırırken, gerekirse --hidden-import
parametresi kullanarak eklentileri ekleyin.
pyinstaller --onefile --noconsole \
--hidden-import=cv2 \
--hidden-import=face_recognition \
--add-data="veritabani.db;." \
main.py
Eğer spec
dosyası kullanıyorsanız, Analysis
bölümüne hiddenimports
ekleyebilirsiniz:
a = Analysis(
['main.py'],
hiddenimports=['cv2', 'face_recognition'],
...
)
1.3. PyQt5 Plugin’leri
PyQt5’in platforma göre ek plugin dosyaları (örneğin platforms/qwindows.dll
) paketlenirken bazen eksik kalabiliyor. Özellikle Windows’ta .exe
oluştururken bu plugin’lerin de dahil edildiğinden emin olmak gerekebilir.
Çözüm:
PyInstaller çoğunlukla PyQt5 plugin’lerini otomatik ekler. Yine de sorun yaşarsanız, spec
dosyanızda binaries
içine ek yapabilirsiniz. Örnek:
datas = [
('path/to/plugins/platforms/qwindows.dll', 'platforms')
]
Ayrıca terminalde komut satırından --add-data
kullanmak da mümkün:
pyinstaller --onefile \
--add-data "C:/Python/Lib/site-packages/PyQt5/Qt/plugins/platforms/qwindows.dll;platforms" \
main.py
2. Uygulamanın Donması ve Bloklanması
2.1. Ana İplik (Main Thread) Üzerinde Yoğun İşlem
PyQt5 GUI’de, ağır veya uzun süren (ör. yüz tanıma, büyük resim işleme) işlemler ana iplikte (UI thread) yürütüldüğünde uygulama geçici olarak “yanıt vermiyor” konumuna geçer. Python ortamında belki kısa sürede iş bitip kurtarıyorsunuz ama .exe
halinde işlem biraz uzuyorsa donma bariz hale gelebilir.
Çözüm – QThread veya Worker Thread Yapısı:
- QThread veya Python Thread ile yoğun işlemleri arka planda yürütün.
- Sonuçlar hazır olduğunda sinyal-slot mekanizması ile arayüze bilgi gönderin.
Temel örnek kod iskeleti şu şekildedir:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel
from PyQt5.QtCore import QThread, pyqtSignal
class Worker(QThread):
# İşlem bittiğinde sinyal gönderelim
finished = pyqtSignal(object)
def __init__(self, image_path, parent=None):
super().__init__(parent)
self.image_path = image_path
def run(self):
# Burada yüz tanıma veya yoğun işlemi yapıyoruz
# ...
result = "Yüz tanıma sonucu"
self.finished.emit(result)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.button = QPushButton("Fotoğrafı Kontrol Et", self)
self.button.clicked.connect(self.start_long_task)
self.label = QLabel("Durum: Bekleniyor...", self)
self.label.move(10, 50)
self.resize(300, 200)
def start_long_task(self):
# Uygulamanın donmaması için işlemi Worker üzerinden yap
image_path = "/path/to/foto.jpg"
self.worker = Worker(image_path)
self.worker.finished.connect(self.on_finished)
self.worker.start()
def on_finished(self, result):
self.label.setText(f"Durum: {result}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
Bu yaklaşımla yüz tanıma gibi CPU yoğunluklu işlemleri arka plana atarsınız; UI donmaz ve .exe
halinde de sorunsuz çalışır.
2.2. Beklenmedik Hataların Kapanması veya Sessizce Yakalanması
Bazen uygulama aslında hata veriyordur fakat .exe
dosyasında “konsol” (terminal) kapalı olduğu için biz hatayı göremeyiz. Hata olduğunda da uygulama takılıp kalıyor gibi gözükebilir.
Çözüm:
.exe
oluştururken --console
veya --noconsole
argümanlarını test edin. --console
ile çalıştığında bir hata mesajı alabilirsiniz:
pyinstaller --onefile --console main.py
Hata mesajlarını yakalamak için try-except blokları veya PyQt’nin qInstallMessageHandler
mekanizmasını kullanarak loglama yapabilirsiniz.
3. SQLite Veritabanı Erişimi
3.1. Veritabanı Dosyası Erişim Yolu
Veritabanı dosyanız .exe
paketine gömülü değilse veya gömülü olup _MEIPASS
altında kopyalanıyorsa, doğru yolu aldığınızdan emin olun. Üstteki “Dinamik Dosya Yolları” konusunu uygulayarak db_path
ayarlamak gerekir.
3.2. Yazma İzinleri
Eğer .exe
’niz “Program Files” benzeri korumalı bir dizine kopyalanıyorsa SQLite veritabanına yazma hakkı olmayabilir. Bu durumda uygulama hata vermese de bir noktada kilitlenebilir veya beklenmeyen davranış sergileyebilir.
Çözüm:
- Veritabanını yazma izni olan bir dizinde (örneğin
C:/Users/Username/AppData/Local/MyApp
gibi) tutun.
- Gerekirse ilk çalıştırmada oraya kopyalayın ve oradan kullanın.
4. Adım Adım Sorun Giderme
Terminalden .exe’yi Çalıştırın
cd dist
.\main.exe
- Hata ya da eksik dosya uyarısı çıkıyorsa görebilirsiniz.
PyInstaller Spec Dosyasını İnceleyin
Analysis
içinde datas
, binaries
, hiddenimports
kısımlarında yüz tanıma için kullandığınız tüm kütüphanelerin gerektiği gibi paketlendiğinden emin olun.
Arka Plan İş Parçacığı (Thread) Kullanın
- Yüz tanıma işlemini mutlaka ayrı bir iş parçacığına taşıyın.
Veritabanı Kayıt ve Erişim Yolunu Kontrol Edin
application_path
ile .db
dosyası doğru yerde mi?
Dağıtım (Deployment) Sonrası Test
- Uygulamayı farklı bir klasöre, hatta mümkünse farklı bir PC’ye kopyalayıp test edin. (Aynı Python kurulumu olmayan bir makinede test etmek, eksik DLL’leri görmenizi sağlar.)
5. Özet ve Profesyonel Yaklaşım
- Thread kullanımı, PyQt uygulamalarında ağır işlemler için bir zorunluluktur. Aksi halde UI donması kaçınılmazdır.
- PyInstaller paketlemesinde dosya yollarını
_MEIPASS
üzerinden ayarlamak, veritabanı ve resim dosyalarına mutlak yoldan erişmediğinizden emin olmak gerekir.
- Gizli import ve eklenti dosyaları (Qt pluginleri, dlib, opencv, vs.)
.exe
içine doğru eklenmediğinde uygulama kilitlenebilir veya dosya bulamayıp sessizce hata alabilir.
- Logging / hata yakalama yöntemleri ve konsol çıktısını izlemeniz, sorunun tam olarak hangi adımda ortaya çıktığını görmenizi sağlar.
Bu adımları titizlikle uygulayarak, hem .py
ortamında hem de PyInstaller ile oluşturulmuş .exe
uygulamanızda donma sorunlarını ortadan kaldırabilir ve yüz tanıma sürecini stabil bir şekilde çalıştırabilirsiniz.