Компиляция кода на Python с зависимостями

Раздел: Разработка на Python -> IDE и редакторы

Компиляция Python проектов с библиотеками

Как упаковать Python скрипт со всеми зависимостями в один исполняемый файл для Windows?

PyInstaller - наиболее универсальный инструмент для создания самодостаточных исполняемых файлов из Python кода. Он поддерживает большинство библиотек, автоматически определяет импорты и упаковывает интерпретатор.

Пример базовой команды для скрипта app.py использующего requests и tkinter:

pip install pyinstaller
pyinstaller --onefile app.py

Pip tools python (pip tools в python)

После выполнения в папке dist появится исполняемый файл. Для скрытия окна консоли (GUI приложения) добавляют флаг --windowed (или -w).

Цель варианта: быстрая упаковка любого Python приложения с минимальными настройками.

Типичная ошибка: Missing module - PyInstaller может не найти некоторые динамические импорты. Решение: указать скрытые импорты вручную --hidden-import module_name или создать .spec файл с настройками.

Как создать кросс-платформенный дистрибутив с помощью cx_Freeze?

cx_Freeze альтернатива PyInstaller, позволяющая создавать не только exe файлы, но и папки с библиотеками для разных ОС. Настройка через setup.py.

Пример для скрипта gui.py использующего PyQt5:

# setup.py
from cx_Freeze import setup, Executable

setup(
    name = "MyApp",
    version = "1.0",
    description = "Пример приложения",
    executables = [Executable("gui.py", base="Win32GUI")]
)

Python build tools (python build tools (инструменты сборки))

Команда сборки: python setup.py build. Результат в папке build.

Цель варианта: более тонкая настройка упаковки (включение дополнительных файлов, исключение неиспользуемых модулей).

Проблема: cx_Freeze часто не включает библиотеки типа numpy корректно. Решение: добавить packages = ["numpy"] в setup() и проверить наличие DLL.

Как собрать приложение с внешними данными (изображения, конфиги) в PyInstaller?

Используют опцию --add-data. Например, для папки data:

pyinstaller --onefile --add-data "data;data" app.py

В коде нужно обращаться к ресурсам через sys._MEIPASS + os.sep + "data" (см. примеры_adv).

Цель: включение не-питоновских файлов в дистрибутив.

Ошибка: путь к ресурсам после компиляции не найден. Решение: использовать функцию resource_path из документации PyInstaller.

- Find python script (поиск python скрипта)
- Compiled python file (скомпилированные файлы python (.pyc))
- где писать код на python (где писать код на python)

Расширенные примеры компиляции с PyInstaller

1. Использование .spec файла для точной настройки:

Пример
pyinstaller --onefile --name=MyApp app.py

Генерируется MyApp.spec. Его редактируют, добавляя datas=[('data/*', 'data')], hiddenimports=['module'].

2. Упаковка с иконкой и подавлением консоли:

Пример
pyinstaller --onefile --windowed --icon=icon.ico app.py

Результат: приложение с кастомной иконкой, без окна терминала.

3. Многоплатформенная сборка (на Windows собирать .exe, на Linux - исполняемый файл). Команда одинаковая, но итоговый файл под конкретную ОС.

Расширенные примеры с cx_Freeze

1. Включение дополнительных файлов и библиотек:

Пример
from cx_Freeze import setup, Executable
setup(
    name="app",
    version="1.0",
    options={
        "build_exe": {
            "packages": ["os", "sys", "numpy"],
            "include_files": [("config.ini", "config.ini")]
        }
    },
    executables=[Executable("main.py", base=None)]
)

Сборка: python setup.py build_exe.

Пример с обработкой путей к ресурсам

Код для PyInstaller (файл app.py):

Пример
import sys, os

def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

with open(resource_path("config.txt"), "r") as f:
    print(f.read())

Команда: pyinstaller --onefile --add-data "config.txt;." app.py.

Вывод (результат): консоль отобразит содержимое config.txt.

Сравнение размеров полученных файлов

Для простого скрипта hello.py (print("Hello")):

Пример
pyinstaller --onefile hello.py  -> 5.2 MB (Windows)
Пример
cx_Freeze: python setup.py build_exe -> папка 8.5 MB

Пояснение: PyInstaller сжимает сильнее, но cx_Freeze даёт больше контроля.

Компиляция Python с библиотеками (PyInstaller, cx_Freeze) - comments

En
компилятор python с библиотеками (python)