Преобразование кода Python в C и создание EXE

Раздел: Сборка -> Создание EXE

Методы конвертации Python в C и сборки EXE

Nuitka как наиболее эффективное решение

Как получить исполняемый EXE из Python, автоматически преобразовав его в C/C++?

Nuitka – это транспилятор Python в C++, который затем компилируется в исполняемый файл. Используется для оптимизации производительности, сокрытия исходного кода и упрощения распространения.

Установка

pip install nuitka

компиляция кода python (компиляция кода python)

Пример простого скрипта

Создайте файл hello.py:

print('Привет, мир!')

Python compile py (компиляция python кода)

Сборка EXE

nuitka --standalone --onefile hello.py

Python to c to exe (конвертация python в c и в exe)

После выполнения появится папка hello.dist или один файл hello.exe (в зависимости от операционной системы и опций).

Типичные ошибки и решения:

  • Ошибка: "No module named ..." при сборке. Решение: Используйте флаг --follow-imports или --include-package=имя_пакета.
  • Ошибка: "gcc не найден". Решение: Установите MinGW (для Windows) и добавьте его в PATH. Для Linux нужен GCC.
  • Ошибка: Файл EXE запускается с консолью. Решение: Добавьте --windows-disable-console для GUI-приложений.

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

Cython с опцией --embed

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

Cython позволяет компилировать Python-код в C-расширения. С опцией --embed можно создать исходный файл C с функцией main, который затем компилируется в исполняемый файл.

Установка

pip install cython

Пример

Создайте main.py:

print('Скомпилировано Cython!')

Выполните команду:

cython main.py --embed
# появится main.c

Теперь скомпилируйте C-файл в EXE (пример для Windows с MinGW):

gcc -o main.exe main.c -I C:\Python39\include -L C:\Python39\libs -lpython39 -lm

Типичные ошибки и решения:

  • Ошибка: python39.lib не найден. Решение: Убедитесь, что путь к libs корректен. Иногда используется python3.lib.
  • Ошибка: Ошибки линковки из-за отсутствия библиотек. Решение: Добавьте -lpython3X (версия) и убедитесь, что библиотека установлена.
  • Ошибка: Отсутствует Python.h. Решение: Установите пакет python-dev на Linux или заголовки для Windows (обычно при установке Python отмечают “Development Libraries”).

Цели использования: Полный контроль над процессом компиляции, возможность тонкой настройки, создание расширений, которые можно встраивать в другие программы.

PyInstaller (альтернатива без конвертации в C)

Как быстро упаковать Python-приложение в один EXE без преобразования в C?

PyInstaller не конвертирует код в C, а упаковывает интерпретатор Python и все зависимости в один архив. Подходит для быстрого создания дистрибутивов, когда защита кода не критична.

Установка

pip install pyinstaller

Пример

pyinstaller --onefile hello.py

Результат – один EXE в папке dist.

Типичные ошибки и решения:

  • Ошибка: Исполняемый файл слишком велик. Решение: Используйте виртуальное окружение для минимизации зависимостей или сжимайте упаковщиком.
  • Ошибка: Антивирус блокирует EXE. Решение: Подписывайте файл цифровой подписью или используйте другие упаковщики.
  • Ошибка: При запуске нет модуля. Решение: Добавьте неявные импорты через --hidden-import.

Цели использования: Быстрое прототипирование, распространение среди пользователей с Windows, когда не требуется производительность или защита исходного кода.

Дополнительные примеры и расширенные сценарии

Nuitka: сборка GUI-приложения с ресурсами

Пример приложения на tkinter с иконкой и отключённой консолью.

Пример
# app.py
import tkinter as tk
root = tk.Tk()
root.title('Пример')
root.geometry('200x100')
tk.Label(root, text='Привет').pack()
root.mainloop()
Пример
nuitka --standalone --onefile --windows-disable-console --windows-icon-from-ico=icon.ico app.py

Результат: Одиночный app.exe без консоли, с иконкой.

Cython с опцией --embed: полный цикл сборки на Windows

Подготовка и компиляция с использованием Visual Studio Build Tools.

Пример
# hello.py
import sys
def main():
    print('Hello from Cython EXE')
if __name__ == '__main__':
    main()
Пример
cython hello.py --embed
cl hello.c /I C:\Python39\include /link /LIBPATH:C:\Python39\libs python39.lib /OUT:hello.exe

Результат: hello.exe можно запускать без Python.

PyInstaller: создание EXE с дополнительными файлами

Использование spec-файла для добавления текстового файла.

Пример
# data_app.py
import os
dir_path = os.path.dirname(__file__)
with open(os.path.join(dir_path, 'data.txt')) as f:
    content = f.read()
print(content)
Пример
pyinstaller --onefile --add-data "data.txt;." data_app.py

Результат: EXE с включённым data.txt, доступным через sys._MEIPASS.

Nuitka: использование внешних библиотек (NumPy)

Сборка скрипта с NumPy может потребовать дополнительных флагов.

Пример
# numpy_test.py
import numpy as np
print(np.array([1,2,3]))
Пример
nuitka --standalone --onefile --follow-imports --nofollow-import-to=numpy numpy_test.py

Результат: EXE работает, но возможны проблемы с упаковкой .so/.pyd. Лучше использовать --include-package=numpy.

Сравнение размеров EXE (результаты)

Скрипт простой печати (hello.py):

Nuitka: 3.5 MB
Cython embed: 2.1 MB
PyInstaller: 9.8 MB

Размеры зависят от версий и флагов.

Конвертация Python в C и в EXE - comments

En
Python to c to exe (python)