158

Интересный Python #11: упаковываем скрипты в .exe

Код программы, написанной на Python, хранится в файлах с расширением .py. Программист легко запустит такую программу с помощью интерпретатора.


Но как быть с не-программистами, которые привыкли запускать программы двойным кликом по значку и не готовы возиться с установкой интерпретатора ради запуска вашего скрипта? Как поделиться программой с друзьями или коллегами?

PyInstaller

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


Как установить PyInstaller

1. Откройте терминал (командную строку);

2. Если умеете пользоваться виртуальным окружением, то создайте и активируйте его. Если нет, то пропустите этот шаг;

3. Выполните команду pip install pyinstaller.


Документация

Документация понятная и актуальная. Ознакомиться с ней можно здесь.

Дальше в посте будет много скриншотов и примеров кода. Прочитать материал в более удобном и структурированном формате можно здесь.

Откройте командную строку и с помощью команды cd перейдите в каталог, в котором лежит ваш код (файл с расширением .py).

Выполните следующую команду: pyinstaller [filename].  filename - это имя модуля, то есть файла с кодом, например, main.py. Вы увидите, как pyinstaller начал свою работу.

В итоге будет создан файл с расширением .spec и 2 директории: build и dist. Перейдите в директорию dist. В ней вы увидите следующие файлы:

Запустите файл с расширением .exe (в примере выше это main.exe). Это и есть ваша программа в виде двоичного файла.

--onefile

Сейчас для того, чтобы поделиться программой с другими людьми, вам понадобится передать им всё содержимое каталога dist. Но если вы хотите, чтобы всё было упаковано в единый файл, то можно указать опцию --onefile: pyinstaller --onefile [filename].


Подключение дополнительных файлов

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

Возможно, вы также захотите прикрутить к своей программе полноценный установщик, вроде такого:

Для этого можно воспользоваться инструментами InstallForge или InnoSetup.

Программирование на python

936 постов11.9K подписчика

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

Вы смотрите срез комментариев. Показать все
4
Автор поста оценил этот комментарий

Чёт как-то очень просто, автор. Ни слова о том, как ебаться с несовместимыми версиями библиотек и самого pyinstaller.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий
Чёт как-то очень просто, автор.

Так это информационная статья для Пикабу, а не диссертация в 3 томах :) Для тех, кому нужны детали, дал ссылку на документацию. А для знакомства с инструментом короткий пост - самое то.


Ни слова о том, как ебаться с несовместимыми версиями библиотек и самого pyinstaller.

Основные либы вроде numpy-pandas-matplotlib-pyqt-django он поддерживает из коробки. Если что-то хитроспецифическое не заводится, то надо ковыряться, но опять же, это не тема для поста на Пикабу.


Через nuitka пробовали собирать то, что на pyinstaller не собралось?

раскрыть ветку (4)
0
Автор поста оценил этот комментарий
Так это информационная статья для Пикабу, а не диссертация в 3 томах :) Для тех, кому нужны детали, дал ссылку на документацию. А для знакомства с инструментом короткий пост - самое то.

Ну так, немного советов по траблшутингу от бывалого было бы полезно, я думаю. Не надо три тома, можно в два уложиться ;-)

Основные либы вроде numpy-pandas-matplotlib-pyqt-django он поддерживает из коробки.

Поддерживать-то поддерживает. Но не каждая версия pyinstaller поддерживает каждую версию либы. Запросто возникают разные головняки вроде такого:


1. pyinstaller версии а.b не работает с либой версии с.d и старше.

2. Решение: временно используйте версию либы e.f.

3. Либа версии e.f несовместима с другой либой в проекте.


Через nuitka пробовали собирать то, что на pyinstaller не собралось?

Не слышал о таком на момент описываемых событий.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий
Ну так, немного советов по траблшутингу от бывалого было бы полезно, я думаю.

Это всегда полезно) Просто пост тогда раздуется ещё сильнее, и читать его будет совсем сложно. На Пикабу стараюсь выкладывать относительно небольшие статьи, так как редактор тут даёт весьма скудные возможности форматирования.


Запросто возникают разные головняки вроде такого...

Хм, а есть пример? Мб набор реальных зависимостей, на котором потестить можно? Просто я собираю всё из виртуального окружения, и с конфликтом версий ни разу не сталкивался, да и в целом не особо понимаю, как они могут возникнуть, если сами модули/пакеты используются ядром интерпретатора точно так же, как в "незапакованном" скрипте.


Не слышал о таком на момент описываемых событий.

https://nuitka.net/

Вроде как даже что-то там оптимизирует, хотя я особой разницы не заметил.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Из личного опыта - Pyinstaller 3.3 был несовместим с setuptools версии 45.0.0. Решалось даунгрейдом до 44.0.0.

А ещё, если память не изменяет, Pyinstaller одно время не дружил с самим Python 3.7, решалось аналогично даунгрейдом до 3.6.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

А, ну 3.3 - это весьма старая версия, ей более 5 лет уже. Собственно, в доке к этим версиям они и пишут, что поддержка Python 3.7 не гарантируется.

Например: https://pypi.org/project/pyinstaller/3.3.1/

"Works out-of-the-box with any Python version 2.7 / 3.3-3.6"


Сейчас прямо на главной странице заявляют, что "Works out-of-the-box with any Python version 3.7-3.10".


Из личного опыта - Pyinstaller 3.3 был несовместим с setuptools версии 45.0.0.

Разбег приличный. 2 с лишним года разницы между релизами Pyinstaller 3.3 и setuptools 45.0.0. В принципе, это не слишком удивительно, т.к. breaking changes происходят и на более мелких временных диапазонах. Взять тот же requests - он с 2016-го года уже много раз ломал обратную совместимость: https://github.com/psf/requests/issues?q=is:issue+is:open+label:"Breaking+API+Change"


Ради интереса накатил сейчас setuptools 45.0.0 - всё работает, то есть обратная совместимость не сломалась за 5 лет)

Иллюстрация к комментарию
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества