Max ve bu gönderinin mükemmel cevabını kullanarak görüntüler veya ses ve kendi araştırmam / testler gibi ekstra veri dosyaları eklemekle ilgili olarak, bu tür dosyaları eklemenin en kolay yolunun ne olduğuna inandığımı anladım.
Canlı bir örnek görmek isterseniz , depom GitHub'da burada .
Not: Bu, pyinstaller ile --onefile
veya -F
komutunu kullanarak derlemek içindir.
Ortamım aşağıdaki gibidir.
Sorunu 2 adımda çözme
Sorunu çözmek için Pyinstaller'a uygulamayla "paketlenmesi" gereken fazladan dosyalara sahip olduğumuzu özellikle söylememiz gerekir.
Ayrıca 'göreceli' bir yol kullanmamız gerekiyor , böylece uygulama bir Python Komut Dosyası veya Frozen EXE olarak çalışırken düzgün çalışabilir.
Bununla birlikte, göreceli yollara sahip olmamızı sağlayan bir işleve ihtiyacımız var. Maks Yayınlanan işlevi kullanarak, ilgili yolu kolayca çözebiliriz.
def img_resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
Yukarıdaki işlevi bu şekilde kullanırdık, böylece uygulama bir Komut Dosyası VEYA Dondurulmuş EXE olarak çalışırken uygulama simgesi görünür.
icon_path = img_resource_path("app/img/app_icon.ico")
root.wm_iconbitmap(icon_path)
Bir sonraki adım, Pyinstaller'a, derleme sırasında fazladan dosyaları nerede bulacağımızı öğretmemiz gerektiğidir, böylece uygulama çalıştırıldığında bunlar geçici dizinde oluşturulur.
Bu sorunu belgelerde gösterildiği gibi iki şekilde çözebiliriz , ancak kişisel olarak kendi .spec dosyamı yönetmeyi tercih ediyorum, bu yüzden bunu yapacağız.
İlk olarak, bir .spec dosyanızın olması gerekir. Benim durumumda, ihtiyacım olanı pyinstaller
fazladan argümanlar ile çalıştırarak yaratabildim , burada fazladan argümanlar bulabilirsiniz . Bu nedenle, benim özellik dosyam sizinkinden biraz farklı görünebilir ancak önemli kısımları açıkladıktan sonra hepsini referans için gönderiyorum.
added_files esasen kayıt düzeni en benim durumumda ben sadece TEK resim eklemek isteyen kulüpler içeren bir Liste, ancak kullanarak en ya jpg en png, çoklu ico en ekleyebilir('app/img/*.ico', 'app/img')
şöyle de başka başlığın yaratabilir Youadded_files = [ (), (), ()]
birden ithalatı var
Hangi dosya veya ne tür tanımlama grubu tanımlayıp ilk bölümü dosyası var bunları nerede bulacağını hem de eklemek istiyorum. Bunu CTRL + C olarak düşünün
Tuple'ın ikinci kısmı Pyinstaller'a 'app / img /' yolunu yapmasını ve dosyaları bu dizine, .exe dosyasını çalıştırdığınızda oluşturulan geçici dizine İLGİLİ yerleştirmesini söyler. Bunu CTRL + V olarak düşünün
Altındaa = Analysis([main...
,datas=added_files
başlangıçta öyle olduğunubelirledim,datas=[]
ancak ithalat listesinin ithal olmasını istiyoruz, bu yüzden özel ithalatlarımızı geçiyoruz.
EXE için belirli bir simge istemediğiniz sürece bunu yapmanıza gerek yok, spec dosyasının altında Pyinstaller'a exe için uygulama simgemi seçenekle ayarlamasını söylüyorum icon='app\\img\\app_icon.ico'
.
added_files = [
('app/img/app_icon.ico','app/img/')
]
a = Analysis(['main.py'],
pathex=['D:\\Github Repos\\Processes-Killer\\Process Killer'],
binaries=[],
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='Process Killer',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True , uac_admin=True, icon='app\\img\\app_icon.ico')
EXE'ye derleniyor
Ben çok tembelim; Yazmak zorunda olduğumdan daha fazla bir şeyler yazmayı sevmiyorum. Sadece tıklayabileceğim bir .bat dosyası oluşturdum. Bunu yapmak zorunda değilsiniz, bu kod bir komut istemi kabuğunda onsuz gayet iyi çalışacaktır.
.Spec dosyası tüm derleme ayarlarımızı ve bağımsız değişkenlerimizi (seçenekler olarak da bilinir) içerdiğinden, bu .spec dosyasını Pyinstaller'a vermemiz yeterlidir.
pyinstaller.exe "Process Killer.spec"
a.datas += ...
) şu anda bana gerçekten yardımcı oldu. pyinstaller dokümantasyonu kullanım hakkında konuşuyor,COLLECT
ancak bu, kullanırken dosyaları ikiliye koyamıyor--onefile