🚫 Чому не варто збирати Python-проєкт у exe через PyInstaller
Багато початківців намагаються зібрати свій Python-проєкт у .exe-файл. Але є чимало причин, чому це не завжди гарна ідея.
Насправді цей процес не є компіляцією.
Фактично відбувається лише упаковка Python-інтерпретатора та бібліотек у саморозпакувальний архів [1].
Коли користувач запускає
1️⃣ Антивіруси часто сприймають такий .exe як загрозу.
Через використання стиснення файлів антивірусне ПЗ може активно скаржитися на ваш
2️⃣ Проблеми з шляхами
3️⃣ Несумісність з окремими бібліотеками
Існує ймовірність, що через особливості певної бібліотеки проєкт не збиратиметься у
4️⃣ Складна діагностика помилок
Упаковка, особливо з опцією
5️⃣ Довгий старт програми
Очевидно що розпаковка з архіву буде сповільнювати запуск.
Хоча збірка у
#PyInstaller
Багато початківців намагаються зібрати свій Python-проєкт у .exe-файл. Але є чимало причин, чому це не завжди гарна ідея.
Насправді цей процес не є компіляцією.
Фактично відбувається лише упаковка Python-інтерпретатора та бібліотек у саморозпакувальний архів [1].
Коли користувач запускає
exe, спочатку виконується розпаковка цього архіву у тимчасову теку, і лише потім — запуск скрипта. Це має низку негативних наслідків: 1️⃣ Антивіруси часто сприймають такий .exe як загрозу.
Через використання стиснення файлів антивірусне ПЗ може активно скаржитися на ваш
exe. Щоб переконатися в цьому, достатньо завантажити файл на VirusTotal. Якщо користувач зробить таку перевірку й побачить попередження, довіра до вас і вашого ПЗ може бути підірвана. 2️⃣ Проблеми з шляхами
exe запускається з однієї теки, але архів розпаковується та виконується в іншій. Це змушує вносити зміни до коду проєкту, які будуть враховувати зміну шляху. 3️⃣ Несумісність з окремими бібліотеками
Існує ймовірність, що через особливості певної бібліотеки проєкт не збиратиметься у
exe. Причому ситуація може змінюватися від версії до версії бібліотеки і python. Найчастіше проблеми виникають із модулями, що використовують код на C/C++. 4️⃣ Складна діагностика помилок
Упаковка, особливо з опцією
--windowed, може маскувати помилки: замість виведення повідомлення у консолі користувач просто отримає падіння програми. На одних пристроях програма може запускатися, а на інших — ні. Виявити причину, виправити її або оновити бібліотеки "на місці" просто неможливо. 5️⃣ Довгий старт програми
Очевидно що розпаковка з архіву буде сповільнювати запуск.
Хоча збірка у
exe може здаватися зручною для поширення, на практиці вона часто створює більше проблем, ніж вирішує.#PyInstaller
👍1
Приклад збірки PyQt6 проєкту PyInstaller-ом.
Якщо Ви все-таки наважилися зібрати свій проєкт pyinstaller у exe пропоную розглянути приклад.
Як приклад будемо використовувати мій шаблон для PyQt6
Шаблон дуже простий - показує просте вікно.
Він має файли які задані відносними шляхами:
1️⃣ Одна з переваг Qt - використання файлів "форм" формату
2️⃣ icon.png це іконка у головному вікні, вона задана main_window.ui через дизайнер "форм" QtDesiginer
Напишемо pyinstaller_build.bat скрипт який буде займатись збіркою у exe
Як бачимо всі файли які використовуються програмою треба додавати опцією
Також сам exe файл може мати іконку для цього має бути використана опція
Опція
Опція
Опція
Але цього недостатньо, щоб наш додаток знаходив файли main_window.ui та icon.png при запуску треба змінювати робочу директорію (це треба робити на самому початку скрипта).
Атрибут _MEIPASS додається динамічно pyinstaller-ом - це тимчасова тека куди розпаковується проєкт
Без цієї вставки коду буде помилка про те, що вказані файли відсутні.
Також я додам скріншот з збіркою без опції
Додаткові файли будуть прикріплені у коментарях.
#PyInstaller #PyQt6
Якщо Ви все-таки наважилися зібрати свій проєкт pyinstaller у exe пропоную розглянути приклад.
Як приклад будемо використовувати мій шаблон для PyQt6
Шаблон дуже простий - показує просте вікно.
Він має файли які задані відносними шляхами:
1️⃣ Одна з переваг Qt - використання файлів "форм" формату
*.ui в даному випадку це - main_window.ui2️⃣ icon.png це іконка у головному вікні, вона задана main_window.ui через дизайнер "форм" QtDesiginer
Напишемо pyinstaller_build.bat скрипт який буде займатись збіркою у exe
SET SCRIPT_NAME=main.py
SET EXE_NAME=prog
.venv\Scripts\pyinstaller.exe ^
--add-data "main_window.ui;." ^
--add-data "icon.png;." ^
--icon "icon.ico" ^
--windowed ^
--onefile ^
--noupx ^
--name %EXE_NAME% ^
%SCRIPT_NAME%
pause
Як бачимо всі файли які використовуються програмою треба додавати опцією
--add-dataТакож сам exe файл може мати іконку для цього має бути використана опція
--icon але треба зауважити що формат іконки має бути саме .ico (png не підходить).Опція
--windowed саме для GUI застосунків щоб сховати вікно консолі. Опція
--onefile саме збірка у exeОпція
--noupx збирати без upx стиснення.Але цього недостатньо, щоб наш додаток знаходив файли main_window.ui та icon.png при запуску треба змінювати робочу директорію (це треба робити на самому початку скрипта).
try:
import os, sys
os.chdir(sys._MEIPASS)
print(f"{sys._MEIPASS=}")
except AttributeError:
pass
Атрибут _MEIPASS додається динамічно pyinstaller-ом - це тимчасова тека куди розпаковується проєкт
Без цієї вставки коду буде помилка про те, що вказані файли відсутні.
Також я додам скріншот з збіркою без опції
--windowed щоб можна було побачити як виглядає sys._MEIPASSДодаткові файли будуть прикріплені у коментарях.
#PyInstaller #PyQt6
👍4❤3