Збираємо проект на python3 - PyQT5 під Windows, використовуючи PyInstaller, SavePearlHarbor

Ще одна копія хабора

Збираємо проект на python3&PPyQT5 під Windows, використовуючи PyInstaller

Причиною написання статті, стала величезна кількість питань, що постійно виникають у новачків: "Як зібрати проект з pyqt5", "Чому не працює", "Який інструмент вибрати" і т.д. Сьогодні навчимося збирати проекти без мук та танців із бубном.

Якось довелося написати невеликий desktop-додаток. Як мову програмування для розробки був обраний python, оскільки для вирішення мого завдання він ідеально підходив. До стандартної бібліотеки Python вже входить бібліотека tkinter, що дозволяє створювати GUI. Але проблема tkinter в тому, що цій бібліотеці присвячено мало уваги, і знайти в інтернеті курс, книгу або FAQ по ній досить складно. Тому було вирішено використовувати потужнішу, сучаснішу та функціональнішу бібліотеку Qt, яка має прив'язки до мови програмування python у вигляді бібліотеки PyQT5. Детальніше про PyQT можете почитати тут. Як приклад я використовуватиму код:

Якщо ви більш-менш досвідчений розробник, то розумієте, що без інтерпретатора код на python не запустити. А хотілося б надати можливість кожному користувачеві використовувати програму. Ось тут до нас на допомогу і приходять спеціальні бібліотеки, що дозволяють збирати проекти в .exe, які можна потім без проблем запустити, як звичайний додаток.

Існує велика кількість бібліотек, що дозволяють це зробити, серед яких найпопулярніші: cx_Freeze, py2exe, nuitka, PyInstaller та ін. Про кожну написано чимало. Але треба сказати, що багато цих рішень дозволяють запускати код тільки на комп'ютері, з встановленим інтерпретатором і pyqt5. Не думаю, що користувач будеморочитися і ставити собі додаткові пакети та програми. Сподіваюся, ви розумієте, що запуск програми на dev-середовищі і у користувача це не те саме. Також слід зазначити, що у кожного рішення були свої проблеми: один не запускався, інший збирав те, що не зміг потім запустити, третій взагалі відмовлявся щось робити.

Після довгих танців з бубном і активним гугленням, мені все ж таки вдалося зібрати проект за допомогою pyinstaller, в повністю працездатний додаток.

Трохи про Pyinstaller

Pyinstaller збирає python-додаток та всі залежності в один пакет. Користувач може запускати програму без встановлення інтерпретатора python або будь-яких модулів. Pyinstaller підтримує python 2.7 та python 3.3+ та такі бібліотеки як: numpy, PyQt, Django, wxPython та інші.

Pyinstaller тестувався на Windows, Mac OS X та Linux. Як би там не було, це не крос-платформний компілятор: щоб зробити програму під Windows, роби це на Windows; Щоб зробити програму під Linux, роби це на Linux і т.д.

PyInstaller успішно використовується з AIX, Solaris та FreeBSD, але тестування не проводилося.

До того ж після складання додаток весело всього близько 15 мегабайт. Це до речі і є перевагою pyinstaller, оскільки він не збирає все поспіль, а лише необхідне. Аналогічні бібліотеки видавали результат за 200-300 мб.

Приступаємо до збирання

Перш ніж приступити до зборки, ми повинні встановити необхідні бібліотеки, а саме pywin32 і власне pyinstaller:

Щоб переконатись, що все нормально встановилося, вводимо команду:

Повинна висвітитися версія pyinstaller. Якщо все правильно встановилося, ідемо далі.

У папці з проектом запускаємо cmd та набираємо:

Власне, це і єнайпростіша команда, яка збере наш проект. Синтаксис команди pyinstaller такий:

pyinstaller [options] script [script …] specfile

Найчастіше використовувані опції:

-onefile - Складання в один файл, тобто. файли .dll не пишуться. —windowed -при запуску програми буде з'являтися консоль. —noconsole — при запуску програми консоль з'являтися не буде. -icon=app.ico - додаємо іконку у вікно. —paths — можливість вручну прописати шлях до необхідних файлів, якщо pyinstaller не може їх знайти (наприклад: —paths D:\python35\Lib\site-packages\PyQt5\Qt\bin)

PyInstaller аналізує файл myscript.py і робить таке:

  1. Пише файл myscript.spec у тій же теці, де знаходиться скрипт.
  2. Створює папку build у тій самій папці, де знаходиться скрипт.
  3. Записує деякі логи та робочі файли до папки build.
  4. Створює папку dist у тій самій папці, де знаходиться скрипт.
  5. Пише виконуваний файл до папки dist.

У результаті наша команда виглядатиме так:

Після роботи програми ви знайдете дві папки: dist та build. Власне в папці dist і знаходиться наша програма. Згодом папку build можна спокійно видалити, вона не впливає на працездатність програми.