Π’Ρ‹ написали Python-скрипт, Π½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π½Π° любом ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Π±Π΅Π· установки ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°? ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π² исполняСмый Ρ„Π°ΠΉΠ» EXE Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту Π·Π°Π΄Π°Ρ‡Ρƒ β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ смогут Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π΄Π²ΠΎΠΉΠ½Ρ‹ΠΌ ΠΊΠ»ΠΈΠΊΠΎΠΌ, ΠΊΠ°ΠΊ стандартноС Windows-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Однако процСсс Π½Π΅ Ρ‚Π°ΠΊ прост, ΠΊΠ°ΠΊ каТСтся: ΠΎΡ‚ Π²Ρ‹Π±ΠΎΡ€Π° инструмСнта Π΄ΠΎ Π±ΠΎΡ€ΡŒΠ±Ρ‹ с зависимостями ΠΈ ошибками компиляции.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Ρ‚Ρ€ΠΈ основных ΠΌΠ΅Ρ‚ΠΎΠ΄Π° компиляции β€” Ρ‡Π΅Ρ€Π΅Π· PyInstaller, Nuitka ΠΈ cx_Freeze, сравним ΠΈΡ… ΠΏΠΎ скорости, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ совмСстимости. А Π΅Ρ‰Ρ‘ расскаТСм, ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки Π²Ρ€ΠΎΠ΄Π΅ ModuleNotFoundError ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с DLL-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ. Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с скриптами для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ инструмСнтов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, управлСния ЧПУ-станками Ρ‡Π΅Ρ€Π΅Π· Python) β€” этот Π³Π°ΠΉΠ΄ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для мастСрской.

1. Π—Π°Ρ‡Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python Π² EXE: ΠΏΠ»ΡŽΡΡ‹ ΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ

ОсновноС прСимущСство компиляции β€” Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΡΡ‚ΡŒ: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Python ΠΈΠ»ΠΈ зависимости. Но Π΅ΡΡ‚ΡŒ ΠΈ обратная сторона:

  • πŸ”Ή Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°: Π΄Π°ΠΆΠ΅ простой скрипт ΠΌΠΎΠΆΠ΅Ρ‚ "Ρ€Π°Π·Π΄ΡƒΡ‚ΡŒΡΡ" Π΄ΠΎ 10–50 ΠœΠ‘ ΠΈΠ·-Π·Π° встроСнного ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.
  • πŸ”Ή Π—Π°ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ часто Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (особСнно ΠΏΡ€ΠΈ использовании PyInstaller).
  • πŸ”Ή ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с антивирусами: Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ инструмСнты (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Nuitka) ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΎΠΆΠ½Ρ‹Π΅ срабатывания Π·Π°Ρ‰ΠΈΡ‚Π½ΠΈΠΊΠΎΠ².
  • πŸ”Ή БлоТности с GUI: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€ΠΎΠ΄Π΅ tkinter ΠΈΠ»ΠΈ PyQt Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройки ΠΏΡ€ΠΈ компиляции.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π°, Ссли:

  • πŸ“Œ Π’Ρ‹ распостраняСтС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ срСди ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π±Π΅Π· тСхничСских Π½Π°Π²Ρ‹ΠΊΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ для расчёта ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚Ρ€ΡƒΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΎΠ²).
  • πŸ“Œ НуТно ΡΠΊΡ€Ρ‹Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ (хотя дСкомпиляция всё Ρ€Π°Π²Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°!).
  • πŸ“Œ Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° систСмах с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π°Π²Π°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° производствСнных Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ…).
πŸ“Š Для Ρ‡Π΅Π³ΠΎ Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Python-скрипты?
Для распространСния срСди ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²
Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ исходный ΠΊΠΎΠ΄
Для удобства запуска Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ПК
Π­ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽ с инструмСнтами
⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ EXE-Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ 100% ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ со всСми вСрсиями Windows. НапримСр, скрипт, скомпилированный Π½Π° Python 3.11 ΠΏΠΎΠ΄ Windows 11, ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ Π½Π° Windows 7 Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

2. Бпособ 1: PyInstaller β€” простой, Π½ΠΎ Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ

PyInstaller β€” самый популярный инструмСнт для компиляции Python Π² EXE. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ numpy, pandas, opencv) ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ°:

  • πŸ“¦ ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ EXE (--onefile) β€” всё упаковываСтся Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» (ΡƒΠ΄ΠΎΠ±Π½ΠΎ для распространСния, Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ запускаСтся).
  • πŸ“‚ Папка с зависимостями (--onedir) β€” создаётся дирСктория с EXE ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ (быстрСС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚).

УстановитС PyInstaller Ρ‡Π΅Ρ€Π΅Π· pip:

pip install pyinstaller

Базовая ΠΊΠΎΠΌΠ°Π½Π΄Π° для компиляции (Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ script.py Π½Π° имя вашСго Ρ„Π°ΠΉΠ»Π°):

pyinstaller --onefile --windowed script.py
⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π€Π»Π°Π³ --windowed ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ консольноС ΠΎΠΊΠ½ΠΎ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для GUI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Для скриптов с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π² консоль этот Ρ„Π»Π°Π³ Π½Π΅ Π½ΡƒΠΆΠ΅Π½!

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ Python (рСкомСндуСтся 3.8–3.11)

УстановитС всС зависимости скрипта Ρ‡Π΅Ρ€Π΅Π· pip

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, Π½ΠΎ рСкомСндуСтся)

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ скрипт Π½Π° ошибки ΠΏΠ΅Ρ€Π΅Π΄ компиляциСй

-->

3. Бпособ 2: Nuitka β€” компиляция Π² настоящий Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ

Nuitka отличаСтся ΠΎΡ‚ PyInstaller Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Python-ΠΊΠΎΠ΄ Π² настоящий ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ (Ρ‡Π΅Ρ€Π΅Π· C/C++), Π° Π½Π΅ просто ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

  • ⚑ БыстрСС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (Π΄ΠΎ 2–5 Ρ€Π°Π· ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с PyInstaller).
  • πŸ—œοΈ МСньший Ρ€Π°Π·ΠΌΠ΅Ρ€ EXE (Π½ΠΎ компиляция Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ).
  • πŸ”’ Π‘Π»ΠΎΠΆΠ½Π΅Π΅ Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (хотя ΠΈ Π½Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ).

Установка ΠΈ базовая компиляция:

pip install nuitka

nuitka --onefile --windows-disable-console script.py

ΠœΠΈΠ½ΡƒΡΡ‹ Nuitka:

  • 🐒 МСдлСнная компиляция (большиС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ часами).
  • 🚫 НС всС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ" (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, tensorflow ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€ΡƒΡ‡Π½ΠΎΠΉ настройки).
  • πŸ›‘οΈ Антивирусы часто Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ скомпилированныС Ρ„Π°ΠΉΠ»Ρ‹ (Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ).
Как ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π² Nuitka?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„Π»Π°Π³ --lto=yes для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ врСмя компиляции, Π½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ EXE).

ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· --include-module=... ΠΈ --exclude-module=....

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π° SSD β€” это сокращаСт врСмя Π½Π° 20–30%.

4. Бпособ 3: cx_Freeze β€” для слоТных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² с GUI

cx_Freeze мСньшС извСстСн, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ справляСтся с графичСскими интСрфСйсами (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, PyQt5, kivy) ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. Однако Π΅Π³ΠΎ настройка слоТнСС, Ρ‡Π΅ΠΌ Ρƒ PyInstaller.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° setup.py для компиляции:

from cx_Freeze import setup, Executable

base = None

if sys.platform == "win32":

base = "Win32GUI" # Для GUI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

setup(

name="MyApp",

version="1.0",

description="My Python App",

executables=[Executable("script.py", base=base)]

)

ЗапуститС ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

python setup.py build
ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ PyInstaller Nuitka cx_Freeze
Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ компиляции Быстрая МСдлСнная БрСдняя
Π Π°Π·ΠΌΠ΅Ρ€ EXE Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ (10–50 ΠœΠ‘) Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ (5–20 ΠœΠ‘) Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ (15–60 ΠœΠ‘)
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° GUI Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ БрСдняя ΠžΡ‚Π»ΠΈΡ‡Π½Π°Ρ
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ настройки Низкая Высокая БрСдняя
Π›ΠΎΠΆΠ½Ρ‹Π΅ срабатывания антивируса Π Π΅Π΄ΠΊΠΎ Часто Π Π΅Π΄ΠΊΠΎ
πŸ’‘

Nuitka ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π³Π΄Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π° cx_Freeze β€” для слоТных GUI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. PyInstaller остаётся ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π·Π°Π΄Π°Ρ‡.

5. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ

Π”Π°ΠΆΠ΅ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ настройкой компиляция ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ошибкой. Рассмотрим самыС частыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

Ошибка 1: ModuleNotFoundError

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°: PyInstaller ΠΈΠ»ΠΈ Nuitka Π½Π΅ находят Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. РСшСниС:

  • πŸ” ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, установлСн Π»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ (pip list).
  • πŸ“ Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ явно: pyinstaller --hidden-import=module_name script.py.
  • πŸ”„ Для Nuitka Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„Π»Π°Π³: --include-module=module_name.

Ошибка 2: Окно консоли появляСтся для GUI-прилоТСния

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°: Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Ρ„Π»Π°Π³ --windowed (для PyInstaller) ΠΈΠ»ΠΈ base="Win32GUI" (для cx_Freeze).

Ошибка 3: EXE Π½Π΅ запускаСтся Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ПК

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

  • πŸ–₯️ ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Microsoft Visual C++ Redistributable (скачайтС с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта).
  • πŸ—‚οΈ НС Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ DLL-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ --add-binary Π² PyInstaller).
  • 🐍 Π Π°Π·Π½Ρ‹Π΅ вСрсии Python (ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ вСрсии, Ρ‡Ρ‚ΠΎ ΠΈ цСлСвая систСма).
πŸ’‘

Если EXE Π½Π΅ запускаСтся, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π»ΠΎΠ³ΠΈ Π² ΠΏΠ°ΠΏΠΊΠ΅ _internal (для PyInstaller) ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„Π»Π°Π³ --debug Π² Nuitka.

6. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ скомпилированного EXE

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» часто получаСтся Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ. Как ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€:

  • 🧹 Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ --exclude-module Π² PyInstaller ΠΈΠ»ΠΈ Nuitka.
  • πŸ”§ UPX-сТатиС: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„Π»Π°Π³ --upx-dir=ΠΏΡƒΡ‚ΡŒ_ΠΊ_upx (скачайтС UPX с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта).
  • πŸ“¦ Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Ρ„Π°ΠΉΠ»Ρ‹: вмСсто --onefile ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ --onedir ΠΈ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с UPX:

pyinstaller --onefile --upx-dir=C:\upx script.py

Для Nuitka ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° достигаСтся Π·Π° счёт Ρ„Π»Π°Π³ΠΎΠ² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

nuitka --lto=yes --enable-plugin=tk-inter --standalone script.py

7. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: Docker ΠΈ Π²Π΅Π±-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ

Если компиляция Π² EXE Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, рассмотритС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹:

  • 🐳 Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹: ΡƒΠΏΠ°ΠΊΡƒΠΉΡ‚Π΅ скрипт Π² ΠΎΠ±Ρ€Π°Π· с прСдустановлСнным Python. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Docker Desktop.
  • 🌐 Π’Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ скрипт Π² Π²Π΅Π±-сСрвис с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Flask/FastAPI + Docker.
  • πŸ“± ΠœΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Kivy ΠΈΠ»ΠΈ BeeWare для компиляции ΠΏΠΎΠ΄ Android/iOS.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Dockerfile для Python-скрипта:

FROM python:3.11-slim

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

CMD ["python", "script.py"]

πŸ’‘

Docker ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… срСд, Π³Π΄Π΅ установка Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ПО Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Для ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ EXE остаётся самым ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ.

FAQ: ЧастыС вопросы ΠΏΠΎ компиляции Python

МоТно Π»ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python Π² EXE ΠΏΠΎΠ΄ Linux ΠΈΠ»ΠΈ macOS?

Π”Π°, Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ Ρ‚ΠΎΠΉ ОБ, Π³Π΄Π΅ Π²Ρ‹ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ. Для кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΠΉ сборки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

  • 🐧 Linux β†’ Windows: wine + PyInstaller (Π½ΠΎ это Π½Π΅Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎ).
  • 🍎 macOS β†’ Windows: Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина с Windows.

Π›ΡƒΡ‡ΡˆΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ОБ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Docker для ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Как ΡΠΊΡ€Ρ‹Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ Π½Π°Π΄Π΅ΠΆΠ½Π΅Π΅, Ρ‡Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· EXE?

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π² EXE Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΊΠΎΠ΄Π°. Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ бСзопасности:

  • πŸ” Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Cython для прСобразования Python Π² C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.
  • πŸ”— ΠžΠ±Π΅Ρ€Π½ΠΈΡ‚Π΅ критичСскиС части ΠΊΠΎΠ΄Π° Π² DLL (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅Ρ€Π΅Π· ctypes).
  • 🌐 ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΠΈΡ‚Π΅ Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π° бэкСнд (Π²Π΅Π±-API) ΠΈ ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ интСрфСйс.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅: 100% Π·Π°Ρ‰ΠΈΡ‚Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° β€” ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ всСгда смоТСт Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ EXE.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ антивирус Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠΎΠΉ скомпилированный EXE?

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹:

  • πŸ›‘οΈ PyInstaller/Nuitka ΠΈΠ½ΠΎΠ³Π΄Π° ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠΎΠ΄ способом, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌ вирусы.
  • πŸ“Œ Π’Π°Ρˆ скрипт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ "ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅" Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с рССстром).

РСшСния:

  • βœ… Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ EXE Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ антивируса.
  • βœ… ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ подписью (Ρ‡Π΅Ρ€Π΅Π· SignTool ΠΎΡ‚ Microsoft).
  • βœ… Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ cx_Freeze β€” ΠΎΠ½ Ρ€Π΅ΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΎΠΆΠ½Ρ‹Π΅ срабатывания.
Как ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ скрипт с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… (SQLite, PostgreSQL)?

Для SQLite ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅Ρ‚ β€” Π±Π°Π·Π° встраиваСтся Π² EXE автоматичСски. Для PostgreSQL/MySQL:

  • πŸ—ƒοΈ Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ Π±Π°Π·Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³-Ρ„Π°ΠΉΠ».
  • πŸ”Œ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ --add-data="ΠΏΡƒΡ‚ΡŒ_ΠΊ_Π±Π°Π·Π΅;Π±Π°Π·Π°" Π² PyInstaller.
  • 🌐 Для ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… Π±Π°Π· Ρ…Π°Ρ€Π΄ΠΊΠΎΠ΄ΡŒΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ URL (Π½Π΅ Π»ΠΎΠ³ΠΈΠ½Ρ‹/ΠΏΠ°Ρ€ΠΎΠ»ΠΈ!).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для PyInstaller:

pyinstaller --onefile --add-data "db.sqlite;." script.py
МоТно Π»ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ скомпилированный EXE Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ компиляции?

НСт. Π›ΡŽΠ±Ρ‹Π΅ измСнСния Π² ΠΊΠΎΠ΄Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ пСрСкомпиляции. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹:

  • πŸ”„ Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ систСму автообновлСния (скачиваниС Π½ΠΎΠ²ΠΎΠ³ΠΎ EXE с сСрвСра).
  • πŸ“¦ Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° основной EXE (Π½Π΅ мСняСтся) ΠΈ внСшниС скрипты (ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ).
  • 🌐 ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΠΈΡ‚Π΅ Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π° сСрвСр (Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅).