0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>22 сен 2025</li>
2
<ul><li>22 сен 2025</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Создаём удобные файлы для запуска Python-программы без Python.</p>
4
</ul><p>Создаём удобные файлы для запуска Python-программы без Python.</p>
5
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
5
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
6
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
7
<p>Чтобы запустить файл программы, написанной на Python (такие файлы имеют расширение .py), нужно, чтобы на компьютере был установлен интерпретатор - специальная программа, которая выполняет код. Однако в Windows пользователи привыкли к исполняемым файлам с расширением .exe, которые запускаются двойным щелчком мыши и не требуют дополнительных действий.</p>
7
<p>Чтобы запустить файл программы, написанной на Python (такие файлы имеют расширение .py), нужно, чтобы на компьютере был установлен интерпретатор - специальная программа, которая выполняет код. Однако в Windows пользователи привыкли к исполняемым файлам с расширением .exe, которые запускаются двойным щелчком мыши и не требуют дополнительных действий.</p>
8
<p>Существует несколько инструментов, чтобы преобразовать Python-скрипт в EXE‑файл.</p>
8
<p>Существует несколько инструментов, чтобы преобразовать Python-скрипт в EXE‑файл.</p>
9
<ul><li><a>PyInstaller - универсальный инструмент для создания EXE</a></li>
9
<ul><li><a>PyInstaller - универсальный инструмент для создания EXE</a></li>
10
<li><a>Auto-Py-to-Exe - утилита с графическим интерфейсом</a></li>
10
<li><a>Auto-Py-to-Exe - утилита с графическим интерфейсом</a></li>
11
<li><a>cx_Freeze - альтернативный подход создания EXE</a></li>
11
<li><a>cx_Freeze - альтернативный подход создания EXE</a></li>
12
<li><a>Py2exe - специализированный инструмент для исполняемых файлов</a></li>
12
<li><a>Py2exe - специализированный инструмент для исполняемых файлов</a></li>
13
<li><a>Nuitka - компилятор Python-кода в машинный код</a></li>
13
<li><a>Nuitka - компилятор Python-кода в машинный код</a></li>
14
<li><a>Какой инструмент для создания EXE выбрать</a></li>
14
<li><a>Какой инструмент для создания EXE выбрать</a></li>
15
</ul><p>Перед тем как использовать любой из этих инструментов, убедитесь, что у вас установлен<a>Python</a>версии 3.11 или 3.12, скачанный с <a>официального сайта</a>.</p>
15
</ul><p>Перед тем как использовать любой из этих инструментов, убедитесь, что у вас установлен<a>Python</a>версии 3.11 или 3.12, скачанный с <a>официального сайта</a>.</p>
16
<p>Также необходима операционная система Windows 10 или новее. Некоторые утилиты могут не работать с последними версиями Python - это связано с тем, что они не всегда обновляются одновременно с языком.</p>
16
<p>Также необходима операционная система Windows 10 или новее. Некоторые утилиты могут не работать с последними версиями Python - это связано с тем, что они не всегда обновляются одновременно с языком.</p>
17
<p>PyInstaller - это инструмент, который превращает Python-скрипт в готовую программу. Внутри EXE оказывается не только код, но и сам интерпретатор Python, и все нужные библиотеки и ресурсы. В результате приложение запускается даже там, где Python не установлен.</p>
17
<p>PyInstaller - это инструмент, который превращает Python-скрипт в готовую программу. Внутри EXE оказывается не только код, но и сам интерпретатор Python, и все нужные библиотеки и ресурсы. В результате приложение запускается даже там, где Python не установлен.</p>
18
<p>PyInstaller очень популярен, и этому есть несколько причин.</p>
18
<p>PyInstaller очень популярен, и этому есть несколько причин.</p>
19
<p><strong>Что в нём хорошего:</strong></p>
19
<p><strong>Что в нём хорошего:</strong></p>
20
<ul><li>Это самый привычный и проверенный способ распространять Python-программы - человеку, который скачает EXE, не придётся устанавливать Python и вручную тянуть зависимости.</li>
20
<ul><li>Это самый привычный и проверенный способ распространять Python-программы - человеку, который скачает EXE, не придётся устанавливать Python и вручную тянуть зависимости.</li>
21
<li>Есть режим "Один файл" - приложение упаковывается в EXE без дополнительных папок.</li>
21
<li>Есть режим "Один файл" - приложение упаковывается в EXE без дополнительных папок.</li>
22
<li>PyInstaller умеет собирать GUI-приложения без лишней консоли на фоне, так что готовое окно выглядит аккуратно.</li>
22
<li>PyInstaller умеет собирать GUI-приложения без лишней консоли на фоне, так что готовое окно выглядит аккуратно.</li>
23
<li>Гибкость: можно тонко управлять, какие модули и ресурсы включать, дописывать SPEC-файл, использовать хуки для библиотек, которые сами по себе не подхватываются.</li>
23
<li>Гибкость: можно тонко управлять, какие модули и ресурсы включать, дописывать SPEC-файл, использовать хуки для библиотек, которые сами по себе не подхватываются.</li>
24
</ul><p><strong>Что плохого:</strong></p>
24
</ul><p><strong>Что плохого:</strong></p>
25
<ul><li>Даже простейшая программа после упаковки превращается в EXE на десятки мегабайт - это плата за то, что вместе с ней идёт Python и всё, что нужно для работы.</li>
25
<ul><li>Даже простейшая программа после упаковки превращается в EXE на десятки мегабайт - это плата за то, что вместе с ней идёт Python и всё, что нужно для работы.</li>
26
<li>Если выбрать режим "Один файл", приложение запускается чуть дольше: сначала оно распаковывается во временную папку, а только потом стартует.</li>
26
<li>Если выбрать режим "Один файл", приложение запускается чуть дольше: сначала оно распаковывается во временную папку, а только потом стартует.</li>
27
<li>Не все зависимости попадают внутрь автоматически. С динамическими импортами, нативными библиотеками или ресурсами часто приходится возиться вручную.</li>
27
<li>Не все зависимости попадают внутрь автоматически. С динамическими импортами, нативными библиотеками или ресурсами часто приходится возиться вручную.</li>
28
<li>Есть ограничения по платформам. EXE можно собрать только на Windows, а чтобы получить приложение для Linux или macOS, придётся собирать его именно на этих системах.</li>
28
<li>Есть ограничения по платформам. EXE можно собрать только на Windows, а чтобы получить приложение для Linux или macOS, придётся собирать его именно на этих системах.</li>
29
<li>Возможны проблемы с системными библиотеками: DLL на Windows или SO на Linux могут вести себя непредсказуемо, если не добавить их правильно.</li>
29
<li>Возможны проблемы с системными библиотеками: DLL на Windows или SO на Linux могут вести себя непредсказуемо, если не добавить их правильно.</li>
30
<li>EXE-файлы, собранные PyInstaller, иногда вызывают ложные тревоги у антивирусов, особенно если не подписывать их цифровой подписью.</li>
30
<li>EXE-файлы, собранные PyInstaller, иногда вызывают ложные тревоги у антивирусов, особенно если не подписывать их цифровой подписью.</li>
31
</ul><p>Вам понадобится менеджер пакетов PIP.</p>
31
</ul><p>Вам понадобится менеджер пакетов PIP.</p>
32
<p>Введите в командной строке следующую команду:</p>
32
<p>Введите в командной строке следующую команду:</p>
33
pip install pyinstaller<p>Python автоматически установит PyInstaller.</p>
33
pip install pyinstaller<p>Python автоматически установит PyInstaller.</p>
34
<p>Теперь нам нужен Python-скрипт, из которого мы сделаем наш экзешник.</p>
34
<p>Теперь нам нужен Python-скрипт, из которого мы сделаем наш экзешник.</p>
35
<p>Напишем код - приветствие в окне Window, используя графическую библиотеку Python<a>Tkinter</a>:</p>
35
<p>Напишем код - приветствие в окне Window, используя графическую библиотеку Python<a>Tkinter</a>:</p>
36
# Импортируем модуль Tkinter - стандартную библиотеку для создания GUI в Python import tkinter as tk # Создаём главное окно приложения root = tk.Tk() # Устанавливаем заголовок окна root.title("Приветствие") # Устанавливаем размеры окна: ширина 550 пикселей, высота 100 пикселей root.geometry("550x100") # Создаём текстовую метку с сообщением и шрифтом Arial, размер 12 label = tk.Label( root, text="Привет, это EXE файл, созданный с помощью PyInstaller!", font=("Arial", 12) ) # Размещаем метку в окне и добавляем отступ сверху/снизу label.pack(pady=20) # Запускаем главный цикл приложения - окно остаётся открытым, пока пользователь его не закроет root.mainloop()<p>Сохраним этот код в файл с расширением .py, назвав его main_py_to_exe.py. Далее откроем командную строку в директории, в которой вы сохранили этот файл, и создадим EXE-файл из Python-скрипта, написав следующую команду:</p>
36
# Импортируем модуль Tkinter - стандартную библиотеку для создания GUI в Python import tkinter as tk # Создаём главное окно приложения root = tk.Tk() # Устанавливаем заголовок окна root.title("Приветствие") # Устанавливаем размеры окна: ширина 550 пикселей, высота 100 пикселей root.geometry("550x100") # Создаём текстовую метку с сообщением и шрифтом Arial, размер 12 label = tk.Label( root, text="Привет, это EXE файл, созданный с помощью PyInstaller!", font=("Arial", 12) ) # Размещаем метку в окне и добавляем отступ сверху/снизу label.pack(pady=20) # Запускаем главный цикл приложения - окно остаётся открытым, пока пользователь его не закроет root.mainloop()<p>Сохраним этот код в файл с расширением .py, назвав его main_py_to_exe.py. Далее откроем командную строку в директории, в которой вы сохранили этот файл, и создадим EXE-файл из Python-скрипта, написав следующую команду:</p>
37
pyinstaller --onefile --noconsole main_py_exe.py<p>pyinstaller - обращение к самой утилите по созданию EXE-файла из скрипта.</p>
37
pyinstaller --onefile --noconsole main_py_exe.py<p>pyinstaller - обращение к самой утилите по созданию EXE-файла из скрипта.</p>
38
<p>--onefile - упаковывает всё приложение в один EXE-файл. Исполняемый файл получается единственным, в нём содержатся все необходимые компоненты, включая интерпретатор Python и используемые библиотеки. Это полезно для минимального объёма дистрибутива, но размер самого файла может быть большим.</p>
38
<p>--onefile - упаковывает всё приложение в один EXE-файл. Исполняемый файл получается единственным, в нём содержатся все необходимые компоненты, включая интерпретатор Python и используемые библиотеки. Это полезно для минимального объёма дистрибутива, но размер самого файла может быть большим.</p>
39
<p>--noconsole - скрывает окно консоли при запуске приложения. Особенно актуально для GUI-приложений, чтобы пользователь видел только графический интерфейс, а не дополнительную консоль.</p>
39
<p>--noconsole - скрывает окно консоли при запуске приложения. Особенно актуально для GUI-приложений, чтобы пользователь видел только графический интерфейс, а не дополнительную консоль.</p>
40
<p>После выполнения предыдущей команды PyInstaller создаст папки dist, build и файл main_py_to_exe.spec.</p>
40
<p>После выполнения предыдущей команды PyInstaller создаст папки dist, build и файл main_py_to_exe.spec.</p>
41
<ul><li>dist - папка с техническими и служебными файлами, такими как скомпилированные версии и логи. Её можно удалить, если вам нужен только исполняемый файл.</li>
41
<ul><li>dist - папка с техническими и служебными файлами, такими как скомпилированные версии и логи. Её можно удалить, если вам нужен только исполняемый файл.</li>
42
<li>build - папка, в которой лежит наш исполняемый файл.</li>
42
<li>build - папка, в которой лежит наш исполняемый файл.</li>
43
<li>main_py_to_exe.spec - файл конфигурации приложения.</li>
43
<li>main_py_to_exe.spec - файл конфигурации приложения.</li>
44
</ul><p>Можно сразу перейти в папку build, и проверить наше собранное приложение. Запускаем исполняемый файл main_py_exe.exe, На экране должно появиться следующее окно:</p>
44
</ul><p>Можно сразу перейти в папку build, и проверить наше собранное приложение. Запускаем исполняемый файл main_py_exe.exe, На экране должно появиться следующее окно:</p>
45
<em>Скриншот: Skillbox Media</em><p>Установим иконку нашему приложению. Для этого поместим файл с расширением .ico рядом с SPEC-файлом. Для примера можно скачать любую бесплатную иконку с <a>этого сайта</a>. У нас иконка ChatGPT. Далее откроем конфигурационный файл с расширением .spec с помощью блокнота и, используя имя ICO-файла, в блок кода настроек EXE ( добавим следующую строку:</p>
45
<em>Скриншот: Skillbox Media</em><p>Установим иконку нашему приложению. Для этого поместим файл с расширением .ico рядом с SPEC-файлом. Для примера можно скачать любую бесплатную иконку с <a>этого сайта</a>. У нас иконка ChatGPT. Далее откроем конфигурационный файл с расширением .spec с помощью блокнота и, используя имя ICO-файла, в блок кода настроек EXE ( добавим следующую строку:</p>
46
icon='logo_chat_gpt_icon_267516.ico'<p>Сохраним файл. Далее введём в этой директории в командной строке команду:</p>
46
icon='logo_chat_gpt_icon_267516.ico'<p>Сохраним файл. Далее введём в этой директории в командной строке команду:</p>
47
pyinstaller main_py_to_exe.spec<p>Эта команда соберёт заново EXE-файл на основе настроек в SPEC-файле. Теперь у приложения появилась иконка. У нас получилось так:</p>
47
pyinstaller main_py_to_exe.spec<p>Эта команда соберёт заново EXE-файл на основе настроек в SPEC-файле. Теперь у приложения появилась иконка. У нас получилось так:</p>
48
<em>Скриншот: Проводник Windows / Skillbox Media</em><p>Все настройки SPEC-файла описаны в официальной документации<a>PyInstaller</a>.</p>
48
<em>Скриншот: Проводник Windows / Skillbox Media</em><p>Все настройки SPEC-файла описаны в официальной документации<a>PyInstaller</a>.</p>
49
<p>Auto-Py-to-Exe - это удобная оболочка для PyInstaller с графическим интерфейсом. Сама по себе она не заменяет PyInstaller, но с ней проще работать: вместо команд в консоли появляется окно, где можно выбрать скрипт, решить, как его упаковать, добавить иконку, подключить дополнительные файлы и ресурсы.</p>
49
<p>Auto-Py-to-Exe - это удобная оболочка для PyInstaller с графическим интерфейсом. Сама по себе она не заменяет PyInstaller, но с ней проще работать: вместо команд в консоли появляется окно, где можно выбрать скрипт, решить, как его упаковать, добавить иконку, подключить дополнительные файлы и ресурсы.</p>
50
<p><strong>Что в нём хорошего:</strong></p>
50
<p><strong>Что в нём хорошего:</strong></p>
51
<ul><li>Всё происходит наглядно: все настройки перед глазами, видно, какие опции включены, и легко понять, что именно изменилось.</li>
51
<ul><li>Всё происходит наглядно: все настройки перед глазами, видно, какие опции включены, и легко понять, что именно изменилось.</li>
52
<li>Программа подсказывает, если путь к скрипту неправильный, иконка не того формата или версия Python несовместима.</li>
52
<li>Программа подсказывает, если путь к скрипту неправильный, иконка не того формата или версия Python несовместима.</li>
53
<li>Можно сохранять конфигурации - если нужно собрать EXE с одинаковыми настройками, достаточно загрузить сохранённый JSON.</li>
53
<li>Можно сохранять конфигурации - если нужно собрать EXE с одинаковыми настройками, достаточно загрузить сохранённый JSON.</li>
54
</ul><p><strong>Что плохого:</strong></p>
54
</ul><p><strong>Что плохого:</strong></p>
55
<ul><li>Auto-Py-to-Exe не заменяет PyInstaller и унаследовала все его ограничения - сложные проекты с нестандартными зависимостями могут потребовать ручной доработки.</li>
55
<ul><li>Auto-Py-to-Exe не заменяет PyInstaller и унаследовала все его ограничения - сложные проекты с нестандартными зависимостями могут потребовать ручной доработки.</li>
56
<li>Иногда приходится вручную указывать дополнительные модули или пути к ресурсам, иначе программа выдаёт ошибку при запуске.</li>
56
<li>Иногда приходится вручную указывать дополнительные модули или пути к ресурсам, иначе программа выдаёт ошибку при запуске.</li>
57
<li>Интерфейс работает через встроенный браузер (обычно Chrome) - если с ним что-то не так, возможны баги или странности.</li>
57
<li>Интерфейс работает через встроенный браузер (обычно Chrome) - если с ним что-то не так, возможны баги или странности.</li>
58
<li>EXE-файл, собранный на одном компьютере, не всегда стабильно запускается на другом - особенно на разных версиях Windows или при отсутствии нужных библиотек.</li>
58
<li>EXE-файл, собранный на одном компьютере, не всегда стабильно запускается на другом - особенно на разных версиях Windows или при отсутствии нужных библиотек.</li>
59
<li>Для крупных проектов со множеством зависимостей, сложной архитектурой или требованием минимального размера сборки Auto-Py-to-Exe может оказаться недостаточно - придётся подключать PyInstaller напрямую.</li>
59
<li>Для крупных проектов со множеством зависимостей, сложной архитектурой или требованием минимального размера сборки Auto-Py-to-Exe может оказаться недостаточно - придётся подключать PyInstaller напрямую.</li>
60
</ul><p>Auto-Py-to-Exe хорошо подходит для небольших или средних проектов, особенно когда нужно быстро собрать GUI-приложение и не хочется разбираться с опциями PyInstaller вручную.</p>
60
</ul><p>Auto-Py-to-Exe хорошо подходит для небольших или средних проектов, особенно когда нужно быстро собрать GUI-приложение и не хочется разбираться с опциями PyInstaller вручную.</p>
61
<p>Подготовим консольное Python-приложение, из которого мы сделаем EXE-файл, написав и сохранив как main.py следующий код:</p>
61
<p>Подготовим консольное Python-приложение, из которого мы сделаем EXE-файл, написав и сохранив как main.py следующий код:</p>
62
# Очистка экрана os.system('cls' if os.name == 'nt' else 'clear') # ASCII-логотип Auto-Py-to-Exe logo = r""" █████╗ ██╗ ██╗████████╗ ██████╗ ██████╗ ██╗ ██╗ ████████╗ ██████╗ ██╔══██╗██║ ██║╚══██╔══╝██╔═══██╗ ██╔══██╗╚██╗ ██╔╝ ╚══██╔══╝██╔═══██╗ ███████║██║ ██║ ██║ ██║ ██║ ██████╔╝ ╚████╔╝ ██║ ██║ ██║ ██╔══██║██║ ██║ ██║ ██║ ██║ ██╔═══╝ ╚██╔╝ ██║ ██║ ██║ ██║ ██║╚██████╔╝ ██║ ╚██████╔╝ ██║ ██║ ██║ ╚██████╔╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ Auto-Py-to-Exe -- Консольный запуск """ print(logo) print("\n" + "=" * 80) print("START".center(80)) print("Нажмите 1 чтобы начать".center(80)) print("=" * 80) # Ожидание действия пользователя choice = input("\nВаш выбор: ") if choice == "1": print("\nAuto-Py-to-Exe запущен! (Здесь может быть логика сборки)") else: print("\nВыход из программы.")<p>Эта программа будет имитировать главное меню входа в приложение.</p>
62
# Очистка экрана os.system('cls' if os.name == 'nt' else 'clear') # ASCII-логотип Auto-Py-to-Exe logo = r""" █████╗ ██╗ ██╗████████╗ ██████╗ ██████╗ ██╗ ██╗ ████████╗ ██████╗ ██╔══██╗██║ ██║╚══██╔══╝██╔═══██╗ ██╔══██╗╚██╗ ██╔╝ ╚══██╔══╝██╔═══██╗ ███████║██║ ██║ ██║ ██║ ██║ ██████╔╝ ╚████╔╝ ██║ ██║ ██║ ██╔══██║██║ ██║ ██║ ██║ ██║ ██╔═══╝ ╚██╔╝ ██║ ██║ ██║ ██║ ██║╚██████╔╝ ██║ ╚██████╔╝ ██║ ██║ ██║ ╚██████╔╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ Auto-Py-to-Exe -- Консольный запуск """ print(logo) print("\n" + "=" * 80) print("START".center(80)) print("Нажмите 1 чтобы начать".center(80)) print("=" * 80) # Ожидание действия пользователя choice = input("\nВаш выбор: ") if choice == "1": print("\nAuto-Py-to-Exe запущен! (Здесь может быть логика сборки)") else: print("\nВыход из программы.")<p>Эта программа будет имитировать главное меню входа в приложение.</p>
63
<p>Чтобы установить Auto-Py-to-Exe, введите следующую команду в командной строке:</p>
63
<p>Чтобы установить Auto-Py-to-Exe, введите следующую команду в командной строке:</p>
64
pip install auto-py-to-exe<p>Python установит Auto-Py-to-Exe. Чтобы запустить графический интерфейс Auto-Py-to-Exe, достаточно написать в консоли:</p>
64
pip install auto-py-to-exe<p>Python установит Auto-Py-to-Exe. Чтобы запустить графический интерфейс Auto-Py-to-Exe, достаточно написать в консоли:</p>
65
python -m auto-py-to<p>Далее откроется графическое меню Auto-Py-to-Exe.</p>
65
python -m auto-py-to<p>Далее откроется графическое меню Auto-Py-to-Exe.</p>
66
<p>Интерфейс состоит из трёх основных вкладок:</p>
66
<p>Интерфейс состоит из трёх основных вкладок:</p>
67
<ul><li>Основные настройки:</li>
67
<ul><li>Основные настройки:</li>
68
</ul><ul><li>Загрузка исходного Python-скрипта.</li>
68
</ul><ul><li>Загрузка исходного Python-скрипта.</li>
69
<li>Выбор режима упаковки (One file или One directory).</li>
69
<li>Выбор режима упаковки (One file или One directory).</li>
70
<li>Выбор типа окна: GUI или Console.</li>
70
<li>Выбор типа окна: GUI или Console.</li>
71
</ul><ul><li>Дополнительные параметры:</li>
71
</ul><ul><li>Дополнительные параметры:</li>
72
</ul><ul><li>Настройка иконки для вашего приложения.</li>
72
</ul><ul><li>Настройка иконки для вашего приложения.</li>
73
<li>Добавление скрытых импортируемых модулей.</li>
73
<li>Добавление скрытых импортируемых модулей.</li>
74
<li>Определение зависимых файлов и ресурсов.</li>
74
<li>Определение зависимых файлов и ресурсов.</li>
75
</ul><ul><li>Продвинутые настройки:</li>
75
</ul><ul><li>Продвинутые настройки:</li>
76
</ul><ul><li>Опции очистки временных файлов.</li>
76
</ul><ul><li>Опции очистки временных файлов.</li>
77
<li>Параметры виртуализации среды и поведения PyInstaller.</li>
77
<li>Параметры виртуализации среды и поведения PyInstaller.</li>
78
</ul><em>Скриншот:<a>Auto-Py-to-Exe</a>/ Skillbox Media</em><p>Справа вверху можно выбрать язык интерфейса. Auto-Py-to-Exe поддерживает множество языков, в том числе и русский.</p>
78
</ul><em>Скриншот:<a>Auto-Py-to-Exe</a>/ Skillbox Media</em><p>Справа вверху можно выбрать язык интерфейса. Auto-Py-to-Exe поддерживает множество языков, в том числе и русский.</p>
79
<p>Кликаем "Расположение" справа вверху и выбираем Python-скрипт, из которого будем делать EXE-файл.</p>
79
<p>Кликаем "Расположение" справа вверху и выбираем Python-скрипт, из которого будем делать EXE-файл.</p>
80
<p>Режим "Один файл" (--onefile) создаёт один исполняемый EXE-файл. "Одна папка" (--onedir) - создаст один каталог с EXE и DLL-библиотеками. Выберем "Одна папка".</p>
80
<p>Режим "Один файл" (--onefile) создаёт один исполняемый EXE-файл. "Одна папка" (--onedir) - создаст один каталог с EXE и DLL-библиотеками. Выберем "Одна папка".</p>
81
<p>Выбираем "Консольное приложение", так как у нас нет графического интерфейса.</p>
81
<p>Выбираем "Консольное приложение", так как у нас нет графического интерфейса.</p>
82
<p>Откройте расширенные настройки:</p>
82
<p>Откройте расширенные настройки:</p>
83
<em>Скриншот:<a>Auto-Py-to-Exe</a>/ Skillbox Media</em><p>Впишите имя приложения name, включите режим clean и выставите log‑level‑значение WARN. Первый параметр будет удалять все старые файлы компиляции, а второй сделает вывод в консоль только важных предупреждений работы программы.</p>
83
<em>Скриншот:<a>Auto-Py-to-Exe</a>/ Skillbox Media</em><p>Впишите имя приложения name, включите режим clean и выставите log‑level‑значение WARN. Первый параметр будет удалять все старые файлы компиляции, а второй сделает вывод в консоль только важных предупреждений работы программы.</p>
84
<p>Обратите внимание на окно "Текущая команда" внизу главного окна Auto‑Py‑to‑Exe. Все введённые выше параметры автоматически дописываются как аргументы командной строки, как если бы мы писали это всё вручную через утилиту PyInstaller.</p>
84
<p>Обратите внимание на окно "Текущая команда" внизу главного окна Auto‑Py‑to‑Exe. Все введённые выше параметры автоматически дописываются как аргументы командной строки, как если бы мы писали это всё вручную через утилиту PyInstaller.</p>
85
<em>Скриншот:<a>Auto-Py-to-Exe</a>/ Skillbox Media</em><p>После всей базовой конфигурации нашего будущего EXE, нажимаем в самом низу "Конвертировать .py в exe". В директории с Python-кодом появится каталог output, а в нём будет лежать наш EXE-файл. Запускаем его.</p>
85
<em>Скриншот:<a>Auto-Py-to-Exe</a>/ Skillbox Media</em><p>После всей базовой конфигурации нашего будущего EXE, нажимаем в самом низу "Конвертировать .py в exe". В директории с Python-кодом появится каталог output, а в нём будет лежать наш EXE-файл. Запускаем его.</p>
86
<em>Скриншот:<a>Auto-Py-to-Exe</a>/ Skillbox Media</em><p>Созданный с помощью Auto-Py-to-Exe экзешник готов.</p>
86
<em>Скриншот:<a>Auto-Py-to-Exe</a>/ Skillbox Media</em><p>Созданный с помощью Auto-Py-to-Exe экзешник готов.</p>
87
<p>cx_Freeze - это библиотека на Python, которая "замораживает" скрипт и превращает его в готовое приложение. Вместе с кодом упаковываются интерпретатор и все нужные зависимости, так что программа запускается без установленного Python. Инструмент работает на Windows, macOS и Linux.</p>
87
<p>cx_Freeze - это библиотека на Python, которая "замораживает" скрипт и превращает его в готовое приложение. Вместе с кодом упаковываются интерпретатор и все нужные зависимости, так что программа запускается без установленного Python. Инструмент работает на Windows, macOS и Linux.</p>
88
<p><strong>Что в нём хорошего:</strong></p>
88
<p><strong>Что в нём хорошего:</strong></p>
89
<ul><li>Программы, собранные через cx_Freeze, обычно запускаются быстрее, чем EXE-файлы, сделанные PyInstaller в режиме "Один файл".</li>
89
<ul><li>Программы, собранные через cx_Freeze, обычно запускаются быстрее, чем EXE-файлы, сделанные PyInstaller в режиме "Один файл".</li>
90
<li>Библиотека кроссплатформенная - можно собирать приложения не только для Windows, но и под другие операционные системы.</li>
90
<li>Библиотека кроссплатформенная - можно собирать приложения не только для Windows, но и под другие операционные системы.</li>
91
<li>Настройки гибкие: можно включать или исключать модули, добавлять картинки, шрифты и другие ресурсы, настраивать поведение GUI‑приложения (например, скрыть консоль).</li>
91
<li>Настройки гибкие: можно включать или исключать модули, добавлять картинки, шрифты и другие ресурсы, настраивать поведение GUI‑приложения (например, скрыть консоль).</li>
92
<li>Проект активно поддерживается - документация обновляется, и последняя версия работает с Python до 3.13.</li>
92
<li>Проект активно поддерживается - документация обновляется, и последняя версия работает с Python до 3.13.</li>
93
</ul><p><strong>Что плохого:</strong></p>
93
</ul><p><strong>Что плохого:</strong></p>
94
<ul><li>Нет режима "Всё в одном файле" - вместо одного EXE получается папка со множеством библиотек.</li>
94
<ul><li>Нет режима "Всё в одном файле" - вместо одного EXE получается папка со множеством библиотек.</li>
95
<li>Папка с программой может сильно разрастись, особенно если в проекте много зависимостей.</li>
95
<li>Папка с программой может сильно разрастись, особенно если в проекте много зависимостей.</li>
96
<li>Иногда cx_Freeze не включает нужные модули - особенно если они загружаются динамически или через нестандартные импорты. Их приходится добавлять вручную.</li>
96
<li>Иногда cx_Freeze не включает нужные модули - особенно если они загружаются динамически или через нестандартные импорты. Их приходится добавлять вручную.</li>
97
<li>Возможны проблемы с системными библиотеками - DLL на Windows или SO/DYLIB на Linux и macOS могут конфликтовать по версиям или лицензиям.</li>
97
<li>Возможны проблемы с системными библиотеками - DLL на Windows или SO/DYLIB на Linux и macOS могут конфликтовать по версиям или лицензиям.</li>
98
<li>Программа требует больше ручной настройки: нужно писать setup-скрипт, разбираться с GUI и путями к ресурсам. Это несложно, но не всегда понятно с первого раза.</li>
98
<li>Программа требует больше ручной настройки: нужно писать setup-скрипт, разбираться с GUI и путями к ресурсам. Это несложно, но не всегда понятно с первого раза.</li>
99
</ul><p>Используя графическую библиотеку Tkinter, подготовим простой Python-скрипт, в котором GUI-окно будет взаимодействовать с консолью:</p>
99
</ul><p>Используя графическую библиотеку Tkinter, подготовим простой Python-скрипт, в котором GUI-окно будет взаимодействовать с консолью:</p>
100
# Импортируем модуль Tkinter и присваиваем ему псевдоним 'tk' import tkinter as tk # Определяем простую функцию, которая выводится в консоль при событии def say_hello(): # Функция выводит строку в консоль print("Привет!") # Создаём объект класса Tk(), представляющий основное окно приложения root = tk.Tk() # Устанавливаем заголовок окна root.title("HelloApp") # Создаём кнопку внутри окна root # Параметры: родительский контейнер, надпись на кнопке, команда обработчик события btn = tk.Button(root, text="Нажми меня", command=say_hello) # Размещаем кнопку в окне с отступами вокруг неё btn.pack(padx=20, pady=20) # Запускаем основной цикл обработки событий Tkinter root.mainloop()<p>Сохраним этот код в файл с именем hello.py.</p>
100
# Импортируем модуль Tkinter и присваиваем ему псевдоним 'tk' import tkinter as tk # Определяем простую функцию, которая выводится в консоль при событии def say_hello(): # Функция выводит строку в консоль print("Привет!") # Создаём объект класса Tk(), представляющий основное окно приложения root = tk.Tk() # Устанавливаем заголовок окна root.title("HelloApp") # Создаём кнопку внутри окна root # Параметры: родительский контейнер, надпись на кнопке, команда обработчик события btn = tk.Button(root, text="Нажми меня", command=say_hello) # Размещаем кнопку в окне с отступами вокруг неё btn.pack(padx=20, pady=20) # Запускаем основной цикл обработки событий Tkinter root.mainloop()<p>Сохраним этот код в файл с именем hello.py.</p>
101
<p>Далее установим cx_Freeze. Установка cx_Freeze аналогична другим инструментам. Для этого введите в командной строке:</p>
101
<p>Далее установим cx_Freeze. Установка cx_Freeze аналогична другим инструментам. Для этого введите в командной строке:</p>
102
pip install cx-freeze<p>Теперь нужно подготовить специальный файл конфигурации, определяющий структуру будущего EXE-пакета:</p>
102
pip install cx-freeze<p>Теперь нужно подготовить специальный файл конфигурации, определяющий структуру будущего EXE-пакета:</p>
103
from cx_Freeze import setup, Executable setup( name = "your_app_name", version = "1.0", description = "Описание вашего приложения", executables = [Executable("hello.py")] )<p>Здесь указаны базовые параметры будущей EXE-программы:</p>
103
from cx_Freeze import setup, Executable setup( name = "your_app_name", version = "1.0", description = "Описание вашего приложения", executables = [Executable("hello.py")] )<p>Здесь указаны базовые параметры будущей EXE-программы:</p>
104
<ul><li>name - имя;</li>
104
<ul><li>name - имя;</li>
105
<li>version - версия;</li>
105
<li>version - версия;</li>
106
<li>description - описание;</li>
106
<li>description - описание;</li>
107
<li>executables - имя исполняемых файлов.</li>
107
<li>executables - имя исполняемых файлов.</li>
108
</ul><p>Сохраним этот файл с именем setup.py в одной директории с Python-скриптом.</p>
108
</ul><p>Сохраним этот файл с именем setup.py в одной директории с Python-скриптом.</p>
109
<p>Открываем консоль в текущей директории и создаём исполняемый файл командой:</p>
109
<p>Открываем консоль в текущей директории и создаём исполняемый файл командой:</p>
110
python setup.py build<p>Результатом станет папка build, содержащая ваше готовое приложение.</p>
110
python setup.py build<p>Результатом станет папка build, содержащая ваше готовое приложение.</p>
111
<em>Скриншот: "Проводник Windows" / Skillbox Media</em><p>Запустим hello.exe, откроются два окна: консоль и графический интерфейс с кнопкой.</p>
111
<em>Скриншот: "Проводник Windows" / Skillbox Media</em><p>Запустим hello.exe, откроются два окна: консоль и графический интерфейс с кнопкой.</p>
112
<em>Скриншот: Skillbox Media</em><p>Если всё сделано правильно, кнопка должна выводить приветствие в консоли.</p>
112
<em>Скриншот: Skillbox Media</em><p>Если всё сделано правильно, кнопка должна выводить приветствие в консоли.</p>
113
<em>Скриншот: Skillbox Media</em><p>Простое EXE-приложение с консолью и графическим интерфейсом создано с помощью cx_Freeze.</p>
113
<em>Скриншот: Skillbox Media</em><p>Простое EXE-приложение с консолью и графическим интерфейсом создано с помощью cx_Freeze.</p>
114
<p><strong>Что в нём хорошего:</strong></p>
114
<p><strong>Что в нём хорошего:</strong></p>
115
<ul><li>Умеет собирать консольные и GUI-приложения.</li>
115
<ul><li>Умеет собирать консольные и GUI-приложения.</li>
116
<li>Есть параметры bundle_files и compressed - можно управлять плотностью упаковки и уменьшать размер.</li>
116
<li>Есть параметры bundle_files и compressed - можно управлять плотностью упаковки и уменьшать размер.</li>
117
<li>При правильной настройке можно получить один EXE-файл плюс нужные библиотеки.</li>
117
<li>При правильной настройке можно получить один EXE-файл плюс нужные библиотеки.</li>
118
<li>Поддерживает актуальные версии Python - вплоть до 3.13.</li>
118
<li>Поддерживает актуальные версии Python - вплоть до 3.13.</li>
119
<li>Проект активный: выходят релизы, добавляется поддержка новых версий, исправляются баги.</li>
119
<li>Проект активный: выходят релизы, добавляется поддержка новых версий, исправляются баги.</li>
120
</ul><p><strong>Что плохого:</strong></p>
120
</ul><p><strong>Что плохого:</strong></p>
121
<ul><li>Работает только под Windows.</li>
121
<ul><li>Работает только под Windows.</li>
122
<li>Даже при сборке "Всё в одном" часто остаются внешние DLL или библиотеки, которые нужно добавлять вручную.</li>
122
<li>Даже при сборке "Всё в одном" часто остаются внешние DLL или библиотеки, которые нужно добавлять вручную.</li>
123
<li>Настройка может потребовать явного указания зависимостей - особенно при динамических импортах или нестандартных механизмах.</li>
123
<li>Настройка может потребовать явного указания зависимостей - особенно при динамических импортах или нестандартных механизмах.</li>
124
<li>Компрессия и упаковка могут замедлить сборку и усложнить отладку.</li>
124
<li>Компрессия и упаковка могут замедлить сборку и усложнить отладку.</li>
125
</ul><p>Подготовим Python-код, из которого будем делать дальнейшую программу:</p>
125
</ul><p>Подготовим Python-код, из которого будем делать дальнейшую программу:</p>
126
import tkinter as tk # Подключение стандартной графической библиотеки Tkinter import random # Модуль для генерации случайных чисел import time # Используется для паузы между действиями class ColorfulSquares(tk.Frame): # Класс наследуется от Frame, представляет собой область содержимого def __init__(self, master=None): # Конструктор класса принимает родителя (главное окно) super().__init__(master) # Вызов конструктора родительского класса (Frame) self.master = master # Присваиваем ссылку на родительский компонент self.pack(fill="both", expand=True) # Отображение компонента во всём окне, занимающем свободное пространство self.canvas = tk.Canvas(self, bg="white", highlightthickness=0) # Создаём холст для рисования self.canvas.pack(fill="both", expand=True) # Холст занимает всё доступное пространство self.canvas.bind('<Button-1>', self.add_square) # Привязываем реакцию на клик мыши к методу add_square def add_square(self, event): # Метод, вызываемый при щелчке мыши """ Отображает цветной квадрат в точке клика """ square_size = 50 # Размер стороны квадрата x = event.x - square_size / 2 # Координата X центра квадрата y = event.y - square_size / 2 # Координата Y центра квадрата colors = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple'] # Палитра цветов color = random.choice(colors) # Случайный выбор цвета из списка item = self.canvas.create_rectangle(x, y, x + square_size, y + square_size, fill=color) # Нарисовали квадрат self.after(2000, lambda: self.canvas.delete(item)) # Удаляем квадрат через 2 секунды if __name__ == '__main__': # Точка входа в программу root = tk.Tk() # Создаём главное окно приложения root.title("Цветные квадраты") # Назначаем заголовок окна app = ColorfulSquares(master=root) # Создаём экземпляр класса ColorfulSquares app.mainloop() # Запускаем бесконечный цикл обработки событий<p>Мы создали окно, в котором при щелчке мышью по пустому пространству появится цветной квадрат. Сохраним файл под именем squares.py.</p>
126
import tkinter as tk # Подключение стандартной графической библиотеки Tkinter import random # Модуль для генерации случайных чисел import time # Используется для паузы между действиями class ColorfulSquares(tk.Frame): # Класс наследуется от Frame, представляет собой область содержимого def __init__(self, master=None): # Конструктор класса принимает родителя (главное окно) super().__init__(master) # Вызов конструктора родительского класса (Frame) self.master = master # Присваиваем ссылку на родительский компонент self.pack(fill="both", expand=True) # Отображение компонента во всём окне, занимающем свободное пространство self.canvas = tk.Canvas(self, bg="white", highlightthickness=0) # Создаём холст для рисования self.canvas.pack(fill="both", expand=True) # Холст занимает всё доступное пространство self.canvas.bind('<Button-1>', self.add_square) # Привязываем реакцию на клик мыши к методу add_square def add_square(self, event): # Метод, вызываемый при щелчке мыши """ Отображает цветной квадрат в точке клика """ square_size = 50 # Размер стороны квадрата x = event.x - square_size / 2 # Координата X центра квадрата y = event.y - square_size / 2 # Координата Y центра квадрата colors = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple'] # Палитра цветов color = random.choice(colors) # Случайный выбор цвета из списка item = self.canvas.create_rectangle(x, y, x + square_size, y + square_size, fill=color) # Нарисовали квадрат self.after(2000, lambda: self.canvas.delete(item)) # Удаляем квадрат через 2 секунды if __name__ == '__main__': # Точка входа в программу root = tk.Tk() # Создаём главное окно приложения root.title("Цветные квадраты") # Назначаем заголовок окна app = ColorfulSquares(master=root) # Создаём экземпляр класса ColorfulSquares app.mainloop() # Запускаем бесконечный цикл обработки событий<p>Мы создали окно, в котором при щелчке мышью по пустому пространству появится цветной квадрат. Сохраним файл под именем squares.py.</p>
127
<p>Установим Py2exe через командную строку:</p>
127
<p>Установим Py2exe через командную строку:</p>
128
pip install py2exe<p>Py2exe, как и cx_Freeze, требует создания конфигурационного файла setup.py, задающего параметры сборки. Для сборки EXE-файла можно ограничиться минимальными настройками:</p>
128
pip install py2exe<p>Py2exe, как и cx_Freeze, требует создания конфигурационного файла setup.py, задающего параметры сборки. Для сборки EXE-файла можно ограничиться минимальными настройками:</p>
129
# setup.py from setuptools import setup import py2exe setup( windows=[{'script': 'squares.py'}], # Основное графическое приложение zipfile=None, options={ 'py2exe': { 'bundle_files': 1, # Созда`м единый и оптимизированный EXE-файл 'optimize': 2 # Уровень оптимизации } }, data_files=[] # Здесь можете добавить любые внешние ресурсы (графику, иконки и так далее) )<p>Откроем командную строку в директорию и скомпилируем наш EXE:</p>
129
# setup.py from setuptools import setup import py2exe setup( windows=[{'script': 'squares.py'}], # Основное графическое приложение zipfile=None, options={ 'py2exe': { 'bundle_files': 1, # Созда`м единый и оптимизированный EXE-файл 'optimize': 2 # Уровень оптимизации } }, data_files=[] # Здесь можете добавить любые внешние ресурсы (графику, иконки и так далее) )<p>Откроем командную строку в директорию и скомпилируем наш EXE:</p>
130
python setup.py py2exe<p>Если всё завершилось без ошибок, в папке с кодом должно было появиться две папки: dist и build. В папке dist находится готовый исполняемый EXE и нужные ему для работы DLL-файлы. Запустим EXE.</p>
130
python setup.py py2exe<p>Если всё завершилось без ошибок, в папке с кодом должно было появиться две папки: dist и build. В папке dist находится готовый исполняемый EXE и нужные ему для работы DLL-файлы. Запустим EXE.</p>
131
<em>Скриншот: Skillbox Media</em><p>EXE-файл, созданный с помощью Py2exe, готов.</p>
131
<em>Скриншот: Skillbox Media</em><p>EXE-файл, созданный с помощью Py2exe, готов.</p>
132
<p><strong>Что в нём хорошего:</strong></p>
132
<p><strong>Что в нём хорошего:</strong></p>
133
<ul><li>Nuitka - это компилятор, который превращает Python-скрипт в машинный код.</li>
133
<ul><li>Nuitka - это компилятор, который превращает Python-скрипт в машинный код.</li>
134
<li>Вместе с кодом он упаковывает интерпретатор и зависимости, поэтому Python на компьютере не нужен.</li>
134
<li>Вместе с кодом он упаковывает интерпретатор и зависимости, поэтому Python на компьютере не нужен.</li>
135
<li>Работает на Windows, macOS и Linux.</li>
135
<li>Работает на Windows, macOS и Linux.</li>
136
<li>Готовое приложение может запускаться быстрее, чем обычный скрипт.</li>
136
<li>Готовое приложение может запускаться быстрее, чем обычный скрипт.</li>
137
<li>Проект активно развивается, документация обновляется, поддерживается Python до версии 3.13.</li>
137
<li>Проект активно развивается, документация обновляется, поддерживается Python до версии 3.13.</li>
138
</ul><p><strong>Что плохого:</strong></p>
138
</ul><p><strong>Что плохого:</strong></p>
139
<ul><li>Сборка занимает больше времени и ресурсов, чем у cx_Freeze или PyInstaller: идёт полноценная компиляция.</li>
139
<ul><li>Сборка занимает больше времени и ресурсов, чем у cx_Freeze или PyInstaller: идёт полноценная компиляция.</li>
140
<li>Настроек много, и новичку может быть непросто сразу во всём разобраться.</li>
140
<li>Настроек много, и новичку может быть непросто сразу во всём разобраться.</li>
141
<li>Документация не всегда дружелюбна, так что часть проблем приходится решать самому.</li>
141
<li>Документация не всегда дружелюбна, так что часть проблем приходится решать самому.</li>
142
</ul><p>Напишем простую консольную программу на Python:</p>
142
</ul><p>Напишем простую консольную программу на Python:</p>
143
def greet_user(): # Запрашиваем ввод имени пользователя user_name = input("Введите Ваше имя: ") # Приветствуем пользователя print(f"Привет, {user_name}! Добро пожаловать в наше приложение.") # Точка входа в программу if __name__ == "__main__": greet_user()<p>Устанавливаем Nuitka через pip в командной строке:</p>
143
def greet_user(): # Запрашиваем ввод имени пользователя user_name = input("Введите Ваше имя: ") # Приветствуем пользователя print(f"Привет, {user_name}! Добро пожаловать в наше приложение.") # Точка входа в программу if __name__ == "__main__": greet_user()<p>Устанавливаем Nuitka через pip в командной строке:</p>
144
pip install nuitka<p>Теперь создадим исполняемый файл с помощью Nuitka:</p>
144
pip install nuitka<p>Теперь создадим исполняемый файл с помощью Nuitka:</p>
145
nuitka --standalone main.py<p>--standalone - без указания этого аргумента Python создаст C-файлы и DLL‑файлы библиотек, а если указать его, Nuitka создаёт отдельный исполняемый файл EXE.</p>
145
nuitka --standalone main.py<p>--standalone - без указания этого аргумента Python создаст C-файлы и DLL‑файлы библиотек, а если указать его, Nuitka создаёт отдельный исполняемый файл EXE.</p>
146
<p>После компиляции должна появиться папка main.dist, в которой будет лежать наша готовая программа с расширением .exe.</p>
146
<p>После компиляции должна появиться папка main.dist, в которой будет лежать наша готовая программа с расширением .exe.</p>
147
<em>Скриншот: "Командная строка Windows" / Skillbox Media</em><p>Выбор зависит от того, что хочется получить в итоге.</p>
147
<em>Скриншот: "Командная строка Windows" / Skillbox Media</em><p>Выбор зависит от того, что хочется получить в итоге.</p>
148
<p>Если нужно быстро и без проблем собрать EXE, подойдёт<strong>PyInstaller</strong>. Он работает почти со всеми библиотеками, и к нему есть хорошая документация и примеры. Но EXE-файлы получаются довольно тяжёлые, а если собирать "одним файлом", то стартовать программа будет медленнее.</p>
148
<p>Если нужно быстро и без проблем собрать EXE, подойдёт<strong>PyInstaller</strong>. Он работает почти со всеми библиотеками, и к нему есть хорошая документация и примеры. Но EXE-файлы получаются довольно тяжёлые, а если собирать "одним файлом", то стартовать программа будет медленнее.</p>
149
<p><strong>Auto-Py-to-Exe</strong> - это по сути тот же PyInstaller, только с удобным графическим интерфейсом. Всё делается с помощью мышки: выбор скрипта, иконки, режима сборки. Но под капотом всё равно PyInstaller, так что ограничения те же.</p>
149
<p><strong>Auto-Py-to-Exe</strong> - это по сути тот же PyInstaller, только с удобным графическим интерфейсом. Всё делается с помощью мышки: выбор скрипта, иконки, режима сборки. Но под капотом всё равно PyInstaller, так что ограничения те же.</p>
150
<p>Если нужно, чтобы приложение запускалось не только на Windows, но и на Linux или macOS, то лучше использовать<strong>cx_Freeze</strong>. Он кроссплатформенный, но требует setup-скрипта и немного больше усилий - новичкам может быть сложнее.</p>
150
<p>Если нужно, чтобы приложение запускалось не только на Windows, но и на Linux или macOS, то лучше использовать<strong>cx_Freeze</strong>. Он кроссплатформенный, но требует setup-скрипта и немного больше усилий - новичкам может быть сложнее.</p>
151
<p><strong>Py2exe</strong> - инструмент только для Windows. Когда-то был очень популярен, но сейчас его реже используют. Тем не менее он работает.</p>
151
<p><strong>Py2exe</strong> - инструмент только для Windows. Когда-то был очень популярен, но сейчас его реже используют. Тем не менее он работает.</p>
152
<p>Если важна скорость конечного приложения, подойдёт<strong>Nuitka</strong>. Это не упаковщик, а компилятор: он переводит Python в C и потом в машинный код. Программы на выходе действительно работают быстрее, но сборка дольше и сложнее в настройке.</p>
152
<p>Если важна скорость конечного приложения, подойдёт<strong>Nuitka</strong>. Это не упаковщик, а компилятор: он переводит Python в C и потом в машинный код. Программы на выходе действительно работают быстрее, но сборка дольше и сложнее в настройке.</p>
153
<a>Научитесь: Профессия Python-разработчик + ИИ Узнать больше</a>
153
<a>Научитесь: Профессия Python-разработчик + ИИ Узнать больше</a>