Глава 20 · Разработка игр с Pygame

Собираем настольную версию игры

PyInstaller собирает игру в самостоятельный исполняемый файл — но только под ту операционную систему, на которой сам запущен.

Игрок, для которого вы делаете игру, почти никогда не станет устанавливать Python и pip install pygame-ce только чтобы её запустить. Игру нужно упаковать в исполняемый файл, который работает сам по себе.

PyInstaller

Один из самых распространённых инструментов для этого на десктопе — PyInstaller: он анализирует вашу программу, находит все нужные модули (включая сам Pygame) и собирает единый исполняемый файл вместе с интерпретатором Python внутри — играть в такую игру можно без установленного Python на компьютере игрока.

pyinstaller.txt
pip install pyinstaller
pyinstaller --onefile --add-data "assets:assets" igra.py

--onefile собирает всё в один файл вместо папки с зависимостями. --add-data явно указывает включить папку assets в сборку — без этого флага PyInstaller упакует только код, а изображения и звуки останутся снаружи готового файла.

Двоеточие в --add-data
В актуальных версиях PyInstaller источник и назначение разделяются двоеточием ("assets:assets") на всех операционных системах, включая Windows. В версиях до 6.0 разделитель зависел от системы, и на Windows нужно было писать точку с запятой: "assets;assets". Если вы работаете со старой закреплённой версией и сборка не находит ассеты — проверьте в первую очередь именно этот символ.

Кроссплатформенность — с оговоркой

PyInstaller не кросс-компилирует
PyInstaller собирает исполняемый файл под ту операционную систему, на которой сам запущен — сборка под Windows делается на Windows, под macOS — на macOS, под Linux — на Linux. Он не умеет собрать .exe для Windows, работая при этом на Linux, и наоборот. Для по-настоящему кроссплатформенного релиза нужен доступ к каждой из целевых операционных систем — либо напрямую, либо через виртуальную машину или облачный сервис сборки.

Скрытые импорты

Pygame устроен так, что часть его модулей подключается не совсем обычным для Python образом — PyInstaller иногда не находит их автоматическим анализом и упускает из сборки. Если готовый исполняемый файл падает с ModuleNotFoundError, хотя из исходного кода игра запускается нормально, обычно помогает явно указать такой модуль через --hidden-import.

Проверяйте собранный файл, а не только исходный код
Работающая игра при запуске через python igra.py и работающий собранный исполняемый файл — не одно и то же гарантированно: разница в путях к ассетам (раздел 20.19) и в скрытых импортах проявляется именно на этапе сборки. Всегда стоит один раз запустить готовый файл на чистом компьютере (или хотя бы из другой папки) перед тем, как считать релиз готовым.