Инструменты для перевода Python кода: компиляция и упаковка

Раздел: Инструменты -> Упаковка и компиляция

Инструменты для компиляции и упаковки Python кода

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

Наиболее эффективным речением для перевода Python кода в автономный исполняемый файл считается компилятор Nuitka. Он транслирует Python в C/C++ и затем компилирует в бинарный файл, что даёт прирост скорости выполнения и существенно усложняет обратную разработку.

# Установка Nuitka
pip install nuitka

перевод кода python (перевод кода python)

Пример компиляции простого скрипта:

nuitka --standalone --onefile --output-dir=build main.py

Разбор ключей:

  • --standalone – сборка с зависимостями, создание папки с DLL.
  • --onefile – упаковка всего в один исполняемый файл.
  • --output-dir – указание папки для результатов.

Типичная проблема: при использовании динамических импортов (например, __import__) Nuitka может не обнаружить модули. Решение – явно указать модули через --include-module.

Цель использования: получение быстрого, защищённого и легкораспространяемого приложения для Windows/macOS/Linux. Nuitka подходит для проектов, где важна скорость выполнения и защита исходного кода.

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

Инструмент PyInstaller создаёт самодостаточную папку или один .exe, который включает интерпретатор Python и все модули. Исходный код остаётся в виде .pyc, что даёт минимальную защиту.

pip install pyinstaller
pyinstaller --onefile --windowed app.py

Ключ --windowed убирает консольное окно для GUI-приложений.

Ошибка: файл .exe блокируется антивирусом. Это происходит из-за упаковки питона в один файл. Решение – использовать режим сборки в папку (--onedir) или подписать файл цифровой подписью.

Случаи использования: быстрая доставка приложения конечным пользователям, когда не требуется маскировка кода.

Как преобразовать Python код в расширение C с помощью Cython?

Cython переводит код с аннотациями типов в C-модуль (.pyd/.so), который можно затем импортировать из Python. Этот метод ускоряет критические участки.

# Файл hello.pyx
def greet(name):
    return f"Привет, {name}!"

Компиляция:

cythonize -i hello.pyx

Результат: файл hello.pyd для Windows или .so для Linux. Импорт из Python работает как с обычным модулем.

Проблема: если функции не имеют аннотаций типов, прирост скорости минимален. Решение – добавлять статические типы в переменные и параметры.

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

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

cx_Freeze упаковывает скрипт и зависимости в папку с исполняемым файлом для разных ОС. Он поддерживает сложные проекты с несколькими скриптами.

# setup.py
from cx_Freeze import setup, Executable

setup(
    name="MyApp",
    version="1.0",
    description="Пример упаковки",
    executables=[Executable("main.py", base="Win32GUI")]
)

Запуск сборки:

python setup.py build

Частая ошибка: отсутствие модулей может не отслеживаться, если они импортируются через __import__. Решение – создать список packages в конфигурации.

Где применимо: крупные проекты с несколькими .py файлами и внешними ресурсами (изображения, шрифты).

Как преобразовать Python код для запуска в браузере (JavaScript)?

Транспайлер Transcrypt переводит подмножество Python в читаемый JavaScript. Полученный код можно исполнять в браузере без сервера.

pip install transcrypt
transcrypt -b script.py

Пример кода:

# script.py
def add(a, b):
    return a + b
print(add(3, 4))

После транспиляции в папке __target__ появляется script.js.

Проблема: не все встроенные модули Python поддерживаются (например, os). Решение – использовать эквивалентные JS-библиотеки или написать заглушки.

Случаи использования: перенос логики с сервера на клиент, создание интерактивных виджетов на Python для веба.

Расширенные примеры с кодом и результатом

Пример 1. Компиляция GUI-приложения с Nuitka и скрытие консоли

Пример
# calculator.py (использует tkinter)
import tkinter as tk

root = tk.Tk()
root.title("Калькулятор")
label = tk.Label(root, text="Пример")
label.pack()
root.mainloop()

Команда компиляции:

Пример
nuitka --standalone --onefile --windows-disable-console calculator.py

Результат: файл calculator.exe (около 10 МБ), который запускает окно без консоли.

Если требуется добавить иконку:

Пример
nuitka --standalone --onefile --windows-disable-console --windows-icon-from-exe=icon.ico calculator.py

Пример 2. Использование PyInstaller с хуками для скрытых импортов

Пример
# script_advanced.py
import ctypes
import sys

def get_platform():
    if sys.platform == "win32":
        import _winapi
        return "Windows"
    elif sys.platform == "linux":
        import posix
        return "Linux"
    else:
        return "Other"

if __name__ == "__main__":
    print(get_platform())

Создание spec-файла с хуком:

Пример
pyinstaller --onefile --hidden-import=_winapi --hidden-import=posix script_advanced.py

После сборки запустите dist/script_advanced.exe:

Windows

Пример 3. Cython с оптимизацией типов для численных расчётов

Пример
# cython_opt.pyx
def sum_range(int n):
    cdef int i
    cdef long long total = 0
    for i in range(n):
        total += i
    return total

Компиляция с аннотациями:

Пример
cython -a cython_opt.pyx   # создаёт HTML с подсветкой

Измерение времени:

Пример
import time
import cython_opt
start = time.perf_counter()
result = cython_opt.sum_range(10**7)
print(f"Результат: {result}, время: {time.perf_counter()-start:.3f} сек")

Результат:

Результат: 49999995000000, время: 0.014 сек

Тот же код на чистом Python выполняется около 0.6 секунды, то есть ускорение в 40 раз.

Пример 4. Упаковка сложного проекта с несколькими консольными утилитами с помощью cx_Freeze

Пример
# setup_multiple.py
from cx_Freeze import setup, Executable

build_exe_options = {
    "packages": ["os", "json"],
    "excludes": ["tkinter"]
}

setup(
    name="Utils",
    version="2.0",
    description="Набор утилит",
    options={"build_exe": build_exe_options},
    executables=[
        Executable("server.py", base="Console"),
        Executable("client.py", base="Win32GUI")
    ]
)

Команда сборки:

Пример
python setup_multiple.py build

В папке build/exe.win-amd64-3.10 будут два .exe файла с общими DLL.

Пример 5. Транспиляция кода с библиотекой Pyodide для запуска в браузере

Pyodide – не транспайлер, а CPython для WebAssembly. Для перевода кода без запуска интерпретатора можно использовать Transcrypt.

Пример
# web_script.py
import math

def circle_area(radius):
    return math.pi * radius ** 2

if __name__ == "__script__":
    print(circle_area(5))

Команда:

Пример
transcrypt -b -n web_script.py

Флаг -n отключает минификацию. Результат (часть JS):

// __target__/web_script.js
var math = {pi: 3.141592653589793};
function circle_area(radius) {
    return math.pi * Math.pow(radius, 2);
}
if (__name__ == "__script__") {
    console.log(circle_area(5));
}

Этот JS можно вставить в HTML и выполнить.

Перевод кода Python - comments

En
перевод кода python (python)