Користуючись чудовою відповіддю Макса і цієї публікації про додавання додаткових файлів даних, таких як зображення чи звук, і власне дослідження / тестування, я зрозумів, що я вважаю, що це найпростіший спосіб додати такі файли.
Якщо ви хочете побачити живий приклад, моє сховище знаходиться тут на GitHub.
Примітка: це для компіляції за допомогою команди --onefile
або -F
з pyinstaller.
Моє оточення таке.
Вирішення проблеми в 2 етапи
Щоб вирішити цю проблему, нам потрібно спеціально сказати Pyinstaller, що у нас є додаткові файли, які потрібно "поєднати" з додатком.
Нам також потрібно використовувати "відносний" шлях , тому програма може працювати належним чином, коли вона працює як сценарій Python або Frozen EXE.
З урахуванням цього нам потрібна функція, яка дозволяє нам мати відносні шляхи. Використовуючи функцію, яку Макс опублікував, ми можемо легко вирішити відносний шлях.
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)
Ми б використовували вищезгадану функцію, як ця, тому піктограма програми з’являється, коли програма працює як сценарій або заморожений EXE.
icon_path = img_resource_path("app/img/app_icon.ico")
root.wm_iconbitmap(icon_path)
Наступним кроком є те, що нам потрібно проінструктувати Pyinstaller про те, де знайти зайві файли при його компілюванні, щоб при запуску програми вони створювались у темп-каталозі.
Ми можемо вирішити цю проблему двома способами, як показано в документації , але я особисто вважаю за краще керувати власним файлом .spec, так що ми це робимо.
По-перше, у вас вже повинен бути файл .spec. У моєму випадку я зміг створити те, що мені потрібно, запустивши pyinstaller
додаткові аргументи, ви можете знайти тут додаткові аргументи . Через це мій специфікаційний файл може виглядати трохи інакше, ніж ваш, але я публікую його для довідки після пояснення важливих бітів.
add_files - це, по суті, список, що містить Tuple, в моєму випадку я хочу лише додати єдине зображення, але ви можете додати кілька ico, png або jpg, використовуючи.('app/img/*.ico', 'app/img')
Ви також можете створити ще один кортеж на зразок,added_files = [ (), (), ()]
щоб мати декілька імпортів
Перша частина кортежу визначає, який файл або тип файлу ви хочете додати, а також де їх знайти. Подумайте про це як CTRL + C
Друга частина кортежу повідомляє Pyinstaller, щоб зробити шлях 'app / img /' та розмістити файли в цьому каталозі ВІДНОСНО до того, що тимчасовий каталог буде створено під час запуску .exe. Подумайте про це як CTRL + V
У статтіa = Analysis([main...
я встановивdatas=added_files
, що раніше це було,datas=[]
але ми хочемо, щоб список імпорту був, ну, імпортним, щоб ми переходили до нашого митного імпорту.
Вам цього не потрібно робити, якщо ви не хочете, щоб конкретна ікона для EXE, внизу файла специфікації, я кажу Pyinstaller, щоб встановити значок мого додатка для exe з опцією 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
Я дуже ледачий; Мені не подобається вводити речі більше, ніж треба. Я створив .bat файл, який я можу просто натиснути. Вам не потрібно цього робити, цей код буде без нього запускатися в оболонці командного рядка.
Оскільки файл .spec містить усі наші параметри компіляції та аргументи (ака-параметри), ми просто мусимо передати цей .spec файл Pyinstaller.
pyinstaller.exe "Process Killer.spec"
a.datas += ...
) насправді мені допоміг. документація pyinstaller розповідає про використання,COLLECT
але це не вдається вставити файли у двійкові при використанні--onefile