Компиляция кода на Python с зависимостями
Компиляция Python проектов с библиотеками
Как упаковать Python скрипт со всеми зависимостями в один исполняемый файл для Windows?
PyInstaller - наиболее универсальный инструмент для создания самодостаточных исполняемых файлов из Python кода. Он поддерживает большинство библиотек, автоматически определяет импорты и упаковывает интерпретатор.
Пример базовой команды для скрипта app.py использующего requests и tkinter:
pip install pyinstaller
pyinstaller --onefile app.pyPip 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.
Расширенные примеры компиляции с 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 даёт больше контроля.