Bir Python Uygulamasını Çalıştırılabilir .deb Dosyasına Dönüştürme

Bir projeye dalıp “Bu kolay olmalı” diye düşündüğünüz ve saatler sonra kendinizi belirsiz hataların, güncelliğini yitirmiş forum yazılarının ve çelişkili tavsiyelerin altında bulduğunuz o anı biliyor musunuz?

Evet, Python uygulamamı .deb dosyasına paketlemeye çalışırken ben de aynısını yaptım.

pdf compressor tool by its foss

Son zamanlarda Python öğrenmeye başladığımdan beri, neden kullanıcı arayüzünü özelleştirmiyorum, mantığı biraz değiştirmiyorum ve ona yeni bir başlangıç ​​yapmıyorum diye düşündüm.

Python uygulaması sanal bir ortamda çalışırken harika çalışıyordu ancak ben bu uygulamayı .deb dosyası olarak göndermekle daha çok ilgileniyordum, böylece kurulum dpkg -i app.deb kadar basit hale geliyordu.

İnternette okuduğum her eğitimde ufak tefek ayrıntılara değinilmişti, ancak hiçbiri bana sürecin tamamını anlatmamıştı.

Doğru paketleme aracını seçmek

Bir Python betiğini yürütülebilir bir dosyaya dönüştürmek için PyInstaller kullanıyorum. Başlangıçta, özellikle .deb paketleri oluşturmak için tasarlanmış bir araç olan py2deb’i kullanmayı denedim.

Kötü fikir. Görünen o ki, py2deb yıllardır bakım görmemiş ve yeni Python sürümlerini desteklemiyor.

PyInstaller, bir Python betiğini alır ve bağımlılıklarıyla birlikte tek bir bağımsız çalıştırılabilir dosyada birleştirir. Bu, kullanıcıların Python’ı ayrıca yüklemesine gerek olmadığı, kullanıma hazır olduğu anlamına gelir.

Adım 1: PyInstaller’ı yükleyin

Öncelikle PyInstaller’ın yüklü olduğundan emin olun. Değilse, pip kullanarak kurun:

pip install pyinstaller

Doğru şekilde kurulup kurulmadığını kontrol edin:

pyinstaller --version

Adım 2: .deb paket yapısını oluşturun

Her şeyi temiz ve düzenli tutmak için .deb paketleri belirli bir klasör yapısını takip eder.

compressor/
├── pdf-compressor/                
│   ├── DEBIAN/                     
│   │   ├── control
│   │   ├── postinst
│   ├── usr/                         
│   │   ├── bin/
│   │   ├── share/
│   │   │   ├── applications/
│   │   │   ├── icons/
│   │   │   ├── pdf-compressor/

Hadi oluşturalım:

mkdir -p pdf-compressor/DEBIAN
mkdir -p pdf-compressor/usr/bin
mkdir -p pdf-compressor/usr/share/applications
mkdir -p pdf-compressor/usr/share/icons/
mkdir -p pdf-compressor/usr/share/pdf-compressor/

Her dizin ne işe yarar?

  • usr/bin/: Çalıştırılabilir dosyayı depolar.
  • usr/share/applications/: .desktop dosyasını içerir (böylece uygulama sistem menüsünde görünür).
  • usr/share/icons/: Uygulama simgesini saklar.
  • DEBIAN/: Paket bilgisi ve bağımlılıklar gibi meta verileri içerir.

İsteğe bağlı: Paketleme bağımlılıkları

Uygulamayı paketlemeden önce, ister bir betik olarak isterse bağımsız bir ikili dosya olarak çalıştırılsın, varlıkları ve bağımlılıkları doğru şekilde yüklediğinden emin olmak istedim.

Başlangıçta iki büyük sorunla karşılaştım:

  1. Paketlenmiş yürütülebilir dosya olarak çalıştırıldığında varlık yolları yanlış olduğundan uygulama içi logo düzgün görüntülenmiyordu.
  2. Uygulama çalıştırılabilir dosya olarak çalıştırıldığında bağımlılık hataları oluştu.

Her şeyin kendi içinde yeterli kalması ve sistem paketleriyle çakışmaların önlenmesi için, pdf-compressor/usr/share/pdf-compressor içinde sanal bir ortam oluşturdum.

python3 -m venv venv
source venv/bin/activate

Daha sonra içindeki tüm bağımlılıkları kurdum:

pip install -r requirements.txt
deactivate

Bu, bağımlılıkların düzgün bir şekilde paketlenmesini ve sistem paketlerini etkilememesini sağlar.

Uygulamanın varlıkları ve bağımlılıkları doğru şekilde yüklediğinden emin olmak için betiği aşağıdaki gibi değiştirdim:

import sys
import os

# Ensure the virtual environment is used
venv_path = "/usr/share/pdf-compressor/venv"
if os.path.exists(venv_path):
    sys.path.insert(0, os.path.join(venv_path, "lib", "python3.10", "site-packages"))

# Detect if running as a standalone binary
if getattr(sys, 'frozen', False):
    app_dir = sys._MEIPASS  # PyInstaller's temp folder
else:
    app_dir = os.path.dirname(os.path.abspath(__file__))

# Set correct paths for assets
icon_path = os.path.join(app_dir, "assets", "icon.png")
logo_path = os.path.join(app_dir, "assets", "itsfoss-logo.webp")
pdf_icon_path = os.path.join(app_dir, "assets", "pdf.png")

print("PDF Compressor is running...")

Burada neler oluyor?

  • sys._MEIPASS → Uygulama PyInstaller ile paketlendiğinde, varlıklar geçici bir klasöre çıkarılır. Bu, erişilebilir olmalarını sağlar.
  • Sanal ortam yolu (/usr/share/pdf-compressor/venv) → Eğer varsa sys.path’e eklenir, böylece yüklü bağımlılıklar bulunabilir.
  • Assets paths → Hem betik hem de bağımsız modlarda çalışabilmeleri için dinamik olarak atanırlar.

Bu değişiklikleri yaptıktan sonra sorunum büyük ölçüde çözüldü.

📋
Bunu halletmenin başka yolları olduğunu biliyorum, ama hâlâ öğrenme aşamasında olduğum için bu yaklaşım benim için işe yaradı. Gelecekte daha iyi bir çözüm bulursam, kesinlikle geliştireceğim!

Adım 3: Python betiğini çalıştırılabilir dosyaya derleme

Şimdi heyecan verici kısma, yani Python betiğini bağımsız bir yürütülebilir dosyaya dönüştürmeye geliyoruz. Ana Python betiğinin bulunduğu kök dizine gidin ve şunu çalıştırın:

pyinstaller --name=pdf-compressor --onefile --windowed --add-data "assets:assets" pdf-compressor.py
  • --onefile: Her şeyi tek bir yürütülebilir dosyaya paketler
  • --windowed: Terminali gizler (GUI uygulamaları için yararlıdır)
  • --name=compress-pdf: Çıktı dosya adını ayarlar
  • --add-data "assets:assets" → Resimlerin/simgelerin eklenmesini sağlar.

Bundan sonra PyInstaller bir dist/ oluşturacak, içinde compress-pdf’i bulacaksınız. Bu bağımsız bir uygulamadır!

Şunu çalıştırmayı deneyin:

./dist/pdf-compressor

Her şey beklendiği gibi çalışıyorsa, onu bir .deb dosyasına paketlemeye hazırsınız demektir.

Adım 4: Yürütülebilir dosyayı doğru konuma taşıyın

Şimdi, bağımsız çalıştırılabilir dosyayı bin dizinine taşıyın:

mv dist/compress-pdf pdf-compressor/usr/bin/pdf-compressor

Adım 5: Bir uygulama simgesi ekleyin

Sizin için durum nedir bilmem ama bana göre, simgesi veya sadece genel dişli simgeleri olmayan bir uygulama eksik kalır. Simge, uygulamanıza hava katar.

İkon ve logo dosyalarının bulunduğu assets dizinini doğru dizine yerleştirelim:

cp assets/ pdf-compressor/usr/share/pdf-compressor

Adım 6: Bir masaüstü dosyası oluşturun

Uygulamanın sistem menüsünde görünmesi için bir .desktop dosyasına ihtiyacımız var. Yeni bir dosya açın:

nano pdf-compressor/usr/share/applications/pdf-compressor.desktop

Bu içeriği yapıştırın:

[Desktop Entry]
Name=PDF Compressor
Comment=Compress PDF files easily
Exec=/usr/bin/pdf-compressor
Icon=/usr/share/icons/pdf-compressor.png
Terminal=false
Type=Application
Categories=Utility
  • Exec → Çalıştırılabilir dosyanın yolu.
  • Icon → Uygulama simgesinin konumu.
  • Terminal=false → GUI uygulaması olarak çalışmasını sağlar.

Kaydedip çıkın (CTRL+X, sonra Y, sonra Enter).

Adım 7: Kontrol dosyasını oluşturun

Her .deb paketinin kalbinde control adı verilen bir meta veri dosyası bulunur.

Bu dosya, Debian paket yöneticisine (dpkg) paketin ne olduğunu, kimin bakımını üstlendiğini, hangi bağımlılıklara sahip olduğunu ve ne işe yaradığına dair kısa bir açıklamayı bildirir.

Bu yüzden bunları burada tanımlamak, kullanıcılar için sorunsuz bir deneyim sağlar.

DEBIAN/ dizininin içinde bir kontrol dosyası oluşturun:

nano pdf-compressor/DEBIAN/control

sonra içine şu içeriği ekledim:

Package: pdf-compressor
Version: 1.0
Section: utility
Priority: optional
Architecture: amd64
Depends: python3, ghostscript
Recommends: python3-pip, python3-venv
Maintainer: Your Name <your@email.com>
Description: A simple PDF compression tool.
 Compress PDF files easily using Ghostscript.

Adım 8: Postinst betiğini oluşturun

Kurulum sonrası (postinst) betiği, adından da anlaşılacağı gibi, paket yüklendikten sonra çalıştırılır. Tüm bağımlılıkların doğru şekilde kurulmasını sağlar.

nano pdf-compressor/DEBIAN/postinst

Bu içeriği ekle:

#!/bin/bash
set -e  # Exit if any command fails

echo "Setting up PDF Compressor..."
chmod +x /usr/bin/pdf-compressor

# Install dependencies inside a virtual environment
python3 -m venv /usr/share/pdf-compressor/venv
source /usr/share/pdf-compressor/venv/bin/activate
pip install --no-cache-dir pyqt6 humanize

echo "Installation complete!"
update-desktop-database

Burada neler oluyor?

  • set -e → Başarısızlık durumunda betiğin durmasını sağlar.
  • Sanal bir ortam oluşturur → Bu, bağımlılıkların izole bir şekilde kurulmasına olanak tanır.
  • chmod +x /usr/bin/pdf-compressor → İkili dosyanın çalıştırılabilir olmasını sağlar.
  • update-desktop-database → Sistemin uygulama veritabanını günceller.

Postinst için doğru izinleri ayarlamak önemlidir:

chmod 755 pdf-compressor/DEBIAN/postinst

Adım 9: deb paketini derleyin ve yükleyin

Tüm bu zorlu çalışmalardan sonra, sonunda her şeyi bir araya getirme zamanı geldi. Paketi derlemek için, yerleşik bir Debian paketleme aracı olan dpkg-deb –build komutunu kullanacağız.

Bu komut yapılandırılmış pdf-compressor dizinimizi alır ve onu herhangi bir Debian tabanlı sisteme kurulabilen bir .deb paketine dönüştürür.

dpkg-deb --build pdf-compressor

Her şey yolunda giderse aşağıdaki gibi bir çıktı görmelisiniz:

dpkg-deb: building package 'pdf-compressor' in 'pdf-compressor.deb'.

Şimdi onu kuralım ve uygulamamızı çalışırken görelim!

sudo dpkg -i pdf-compressor.deb
💡

Eksik bağımlılıklar nedeniyle kurulum başarısız olursa, şunları kullanarak bunları düzeltin: sudo apt install -f

Bu, pdf-compressor’ı sisteminize diğer Debian paketleri gibi yükler. Doğrulamak için, Uygulamalar menüsünden veya doğrudan terminal üzerinden başlatabilirsiniz:

pdf-compressor

Son düşünceler

Bir Python uygulamasını paketlemek ilk düşündüğüm kadar basit değil. Araştırmam sırasında, baştan sona tüm süreci adım adım anlatan sağlam bir rehber bulamadım.

Yani denemek, başarısız olmak ve öğrenmek zorundaydım ve bu rehberde tam olarak bunu paylaştım. Geriye dönüp baktığımda, daha iyi bilseydim, mücadele ettiğim birçok şeyin basitleştirilebileceğini fark ediyorum. Ama öğrenmek de tam olarak bu değil mi?

 

 

Yazının orijinalini buradan okuyabilirsiniz

Hüseyin GÜÇ

Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım. Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum. Son 6 yıldır  sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum. Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.