Преобразование кода Python в C и создание 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
Размеры зависят от версий и флагов.