Menggunakan jawaban luar biasa dari Max dan Posting ini tentang menambahkan file data tambahan seperti gambar atau suara & penelitian / pengujian saya sendiri, saya telah menemukan apa yang saya yakini sebagai cara termudah untuk menambahkan file semacam itu.
Jika Anda ingin melihat contoh langsung, repositori saya ada di sini di GitHub.
Catatan: ini untuk kompilasi menggunakan perintah --onefile
or -F
dengan pyinstaller.
Lingkungan saya adalah sebagai berikut.
Memecahkan masalah dalam 2 langkah
Untuk mengatasi masalah ini, kami perlu memberi tahu Pyinstaller secara khusus bahwa kami memiliki file tambahan yang perlu "digabungkan" dengan aplikasi.
Kita juga perlu menggunakan path 'relative' , sehingga aplikasi dapat berjalan dengan baik ketika dijalankan sebagai Python Script atau Frozen EXE.
Dengan itu kita membutuhkan fungsi yang memungkinkan kita memiliki jalur relatif. Menggunakan fungsi yang Diposting Maks kita dapat dengan mudah menyelesaikan jalur relatif.
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)
Kami akan menggunakan fungsi di atas seperti ini sehingga ikon aplikasi muncul ketika aplikasi berjalan baik sebagai Script ATAU Frozen EXE.
icon_path = img_resource_path("app/img/app_icon.ico")
root.wm_iconbitmap(icon_path)
Langkah selanjutnya adalah kita perlu menginstruksikan Pyinstaller di mana menemukan file tambahan saat dikompilasi sehingga ketika aplikasi dijalankan, mereka dibuat di direktori temp.
Kami dapat menyelesaikan masalah ini dengan dua cara seperti yang ditunjukkan dalam dokumentasi , tetapi saya pribadi lebih suka mengelola file .spec saya sendiri jadi begitulah cara kami melakukannya.
Pertama, Anda harus sudah memiliki file .spec. Dalam kasus saya, saya dapat membuat apa yang saya butuhkan dengan menjalankan pyinstaller
argumen tambahan, Anda dapat menemukan argumen tambahan di sini . Karena itu, file spesifikasi saya mungkin terlihat sedikit berbeda dari milik Anda tetapi saya memposting semuanya untuk referensi setelah saya menjelaskan bagian-bagian penting.
added_files pada dasarnya adalah List yang berisi Tuple's, dalam kasus saya, saya hanya ingin menambahkan gambar TUNGGAL, tetapi Anda dapat menambahkan beberapa ico's, png's atau jpg's menggunakan('app/img/*.ico', 'app/img')
Anda juga dapat membuat tuple lain seperti ituadded_files = [ (), (), ()]
untuk memiliki banyak impor
Bagian pertama tupel mendefinisikan file apa atau jenis file apa yang ingin Anda tambahkan serta di mana menemukannya. Pikirkan ini sebagai CTRL + C
Bagian kedua dari tuple memberi tahu Pyinstaller, untuk membuat jalur 'app / img /' dan menempatkan file di direktori tersebut RELATIF ke direktori temp apa pun yang dibuat saat Anda menjalankan .exe. Pikirkan ini sebagai CTRL + V
Di bawaha = Analysis([main...
, saya telah menetapkandatas=added_files
, awalnya duludatas=[]
tetapi kami ingin daftar impor menjadi, baik, diimpor jadi kami meneruskan impor kustom kami.
Anda tidak perlu melakukan ini kecuali Anda menginginkan ikon khusus untuk EXE, di bagian bawah file spesifikasi, saya memberi tahu Pyinstaller untuk mengatur ikon aplikasi saya untuk exe dengan opsi 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')
Mengompilasi ke EXE
Saya sangat malas; Saya tidak suka mengetik lebih dari yang harus saya lakukan. Saya telah membuat file .bat yang bisa saya klik. Anda tidak harus melakukan ini, kode ini akan berjalan di shell prompt perintah dengan baik tanpa itu.
Karena file .spec berisi semua pengaturan kompilasi & args (alias opsi), kami hanya perlu memberikan file .spec itu ke Pyinstaller.
pyinstaller.exe "Process Killer.spec"
a.datas += ...
) sangat membantu saya sekarang. dokumentasi pyinstaller berbicara tentang penggunaanCOLLECT
tetapi gagal untuk memasukkan file ke dalam biner saat menggunakan--onefile