Как уменьшить размер exe файла python

Обновлено: 07.07.2024

Кроме этого, я предполагаю, что практика делает прекрасным. И читайте обо всем, что можно найти о потенциальных проблемах, на которые можно наткнуться. Используя файлы сброса, корректный doctypes, блоки проверки допустимости и платформы могли бы помочь Вам до некоторой степени, но в конце Вы управляете кодом, и только Вы знаете точно, на что Вы хотите, чтобы он был похож. Код мог бы быть действительным, и браузер мог бы сделать точно, чему Вы сказали его, и все еще не похоже на то, к чему Вы хотите его.

, Чем больше Вы используете CSS в целях расположения, тем с большим количеством проблем Вы встретитесь, больше проблем, Вы найдете путь вокруг и больше Вы будете учиться. После довольно многих лет создания разметок полностью со структурированным, семантическим HTML и neat'n'tidy CSS я редко должен тратить много дефектов исправления времени в одном или другом браузере.

2 ответа

Большую часть пространства занимает сама среда выполнения Python. py2exe не "компилирует" вашу программу под собственные инструкции x86 или что-то подобное. Он просто объединяет Python, ваши файлы * .pyc и любые модули, которые ваша программа использует, в пакет, который запускается сам по себе.

Таким образом, вы можете распространять только свои файлы * .pyc и оставить это на усмотрение пользователя. предоставить собственный дистрибутив Python и установить все необходимые модули. Это не очень популярный вариант в Windows, но он обычно случается везде.

и любые модули, используемые вашей программой, объединяются в пакет, который запускается самостоятельно.

Таким образом, вы можете выбрать распространение только ваших файлов * .pyc и предоставить пользователю возможность предоставить свой собственный дистрибутив Python и установить любые необходимые модули. Это не очень популярный вариант в Windows, но он обычно случается везде.

и любые модули, используемые вашей программой, объединяются в пакет, который запускается самостоятельно.

Таким образом, вы можете выбрать распространение только ваших файлов * .pyc и предоставить пользователю возможность предоставить свой собственный дистрибутив Python и установить любые необходимые модули. Это не очень популярный вариант в Windows, но он обычно случается везде.

У меня есть простой pandas pyinstaller exe, размер которого превышает 40 МБ.

40MB + для этого кажется немного излишним.

Как я могу уменьшить это как можно больше?

Это, однако, не практично, учитывая, насколько большим будет список исключений.

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

Это также стоит упомянуть. По умолчанию Pyinstaller не обнаруживает панд.

Возможное решение при использовании нескольких исполняемых файлов может заключаться в том, чтобы связать каждый исполняемый файл с отдельной папкой или исполняемым файлом со всеми импортами.

попробуйте настроить вашу среду с помощью virtualenv и установить туда только необходимые библиотеки

Я чувствую, что оба эти ответа превосходны.

Для меня это простой случай использования панд, что exe огромен.

Хотя удаление некоторых каталогов было полезным, так же как и UPXING, это также очень помогло.

Я сильно уменьшил его, и он не делал этого по умолчанию.

Тем не менее, об окончательном и наиболее импортном решении говорится здесь: Импорт модулей Python из выбранного места . Таким образом, была функция, которая делала все это, но сейчас есть некоторая ручная обработка, потому что: multipackage-bundles не работает.

Теперь к простому решению для многих exe's

Если у вас много исполняемых файлов, я настоятельно рекомендую такой подход:

Теперь поместите файл abd.exe в один каталог папки abc.py, а также любые другие внешние скрипты. Убедитесь, что они имеют разные имена, или будет запущен только один скрипт.

Это работает очень хорошо, потому что все зависимости находятся в одной папке. Так и должно быть. Так что в этом примере скажем, у вас была одна папка 40 МБ. Для каждого дополнительного exe-файла впоследствии он будет только + 5 МБ (или насколько большим будет exe-файл), а не 40 МБ каждый.

Интерпретатор Python и все импортированные модули включены в исполняемый файл.

Вы можете попробовать добавить модули, которые вы хотите исключить, в список excludes под Analysis в вашем файле спецификации.

Вы также можете попробовать сжать исполняемый файл с помощью UPX. Смотрите Примечание по использованию UPX

Установка PyInstaller не отличается от установки любой другой библиотеки Python.

Вот так можно проверить версию PyInstaller.

Я использую PyInstaller версии 4.2.

Создание exe файла с помощью PyInstaller

PyInstaller собирает в один пакет Python-приложение и все необходимые ему библиотеки следующим образом:

  1. Считывает файл скрипта.
  2. Анализирует код для выявления всех зависимостей, необходимых для работы. spec, который содержит название скрипта, библиотеки-зависимости, любые файлы, включая те параметры, которые были переданы в команду PyInstaller.
  3. Собирает копии всех библиотек и файлов вместе с активным интерпретатором Python.
  4. Создает папку BUILD в папке со скриптом и записывает логи вместе с рабочими файлами в BUILD.
  5. Создает папку DIST в папке со скриптом, если она еще не существует.
  6. Записывает все необходимые файлы вместе со скриптом или в одну папку, или в один исполняемый файл.

Если использовать параметр команды onedir или -D при генерации исполняемого файла, тогда все будет помещено в одну папку. Это поведение по умолчанию. Если же использовать параметр onefile или -F , то все окажется в одном исполняемом файле.

Возьмем в качестве примера простейший скрипт на Python c названием simple.py, который содержит такой код.

Создадим один исполняемый файл. В командной строке введите:

После завершения установки будет две папки, BUILD и DIST, а также новый файл с расширением .spec. Spec-файл будет называться так же, как и файл скрипта.

папки, BUILD и DIST, а также файл .spec

Python создает каталог распространения, который содержит основной исполняемый файл, а также все динамические библиотеки.

 исполняемый файл

Вот что произойдет после запуска файла.

Добавление файлов с данными

Также, открыв spec-файл, можно увидеть раздел datas, в котором указывается, что файл netflix_titles.csv копируется в текущую директорию.

Запустим файл simple1.exe, появится консоль с выводом: Всего фильмов: 7787 .

Добавление файлов с данными и параметр onefile

Скрипт обновлен для чтения папки TEMP и файлов с данными. Создадим exe-файл с помощью onefile и add-data.

После успешного создания файл simple1.exe появится в папке DIST.

Можно скопировать исполняемый файл на рабочий стол и запустить, чтобы убедиться, что нет никакой ошибки, связанной с отсутствием файла.

Добавление файлов с данными и параметр onefile

Дополнительные импорты с помощью Hidden Imports

Исполняемому файлу требуются все импорты, которые нужны Python-скрипту. Иногда PyInstaller может пропустить динамические импорты или импорты второго уровня, возвращая ошибку ImportError: No module named …

Для решения этой ошибки нужно передать название недостающей библиотеки в hidden-import.

Например, чтобы добавить библиотеку os, нужно написать вот так:

Файл spec

Файл spec — это первый файл, который PyInstaller создает, чтобы закодировать содержимое скрипта Python вместе с параметрами, переданными при запуске.

PyInstaller считывает содержимое файла для создания исполняемого файла, определяя все, что может понадобиться для него.

Файл с расширением .spec сохраняется по умолчанию в текущей директории.

Если у вас есть какое-либо из нижеперечисленных требований, то вы можете изменить файл спецификации:

  • Собрать в один бандл с исполняемым файлы данных.
  • Включить другие исполняемые файлы: .dll или .so.
  • С помощью библиотек собрать в один бандл несколько программы.

Например, есть скрипт simpleModel.py, который использует TensorFlow и выводит номер версии этой библиотеки.

Компилируем модель с помощью PyInstaller:

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

Исправим ее, обновив файл spec. Одно из решений — создать файл spec.

Команда pyi-makespec создает spec-файл по умолчанию, содержащий все параметры, которые можно указать в командной строке. Файл simpleModel.spec создается в текущей директории.

Поскольку был использован параметр --onefile , то внутри файла будет только раздел exe.

Если использовать параметр по умолчанию или onedir, то вместе с exe-разделом будет также и раздел collect.

Можно открыть simpleModel.spec и добавить следующий текст для создания хуков.

Создаем хуки и добавляем их в hidden imports и раздел данных.

Файлы хуков расширяют возможность PyInstaller обрабатывать такие требования, как необходимость включать дополнительные данные или импортировать динамические библиотеки.

Обычно пакеты Python используют нормальные методы для импорта своих зависимостей, но в отдельных случаях, как например TensorFlow, существует необходимость импорта динамических библиотек. PyInstaller не может найти все библиотеки, или же их может быть слишком много. В таком случае рекомендуется использовать вспомогательный инструмент для импорта из PyInstaller.utils.hooks и собрать все подмодули для библиотеки.

Скомпилируем модель после обновления файла simpleModel.spec.

Скопируем исполняемый файл на рабочий стол и увидим, что теперь он корректно отображает версию TensorFlow.

Вывод:

PyInstaller предлагает несколько вариантов создания простых и сложных исполняемых файлов из Python-скриптов:

Все мы знаем, что пайтон интерпретируемый язык и получить настоящий скомпилированный exe файл - нет возможности. Однако, есть такие проекты как: py2exe или cx_freeze, которые, анализируя код приложения, собирают все зависимые библиотеки и сам интерпретатор в отдельной папке, и создают запускающий exe файл. Этот exe файл при запуске подготовит окружение для нашего приложения, запустит интерпретатор python и уже в нем - наше приложение. После работ утилит py2exe или cx_freeze у нас всегда появляются куча dll и др. файлов.



Так что же сделать для получения одного exe файла, вместо кучи файлов?


Будем считать, что у нас уже есть папка (dist) с зависимыми файлами, после прогона py2exe или cx_freeze .

Первым делом, чистим за утилитами py2exe или cx_freeze библиотеки и файлы, которые гарантированно не будут использоваться. (например: w9xpopen.exe). Таким образом, уменьшаем размер нашего будущего exe файла и скорость его загрузки.

Все параметры упаковки лучше запомнить, так как далее они понадобятся.

Я упаковку делаю из командной строки поэтому и запомнить просто :)

Например: C:\7-Zip\7z.exe a -r -t7z -m1=LZMA dist.7z dist\*.*

Далее начинается темная магия, которой порой, пользуются всякие недалекие вирусописатели.

Далее готовим файл настройки для модуля 7zsd.sfx :

RunProgram background-color: transparent; color: black; font-family: Arial; font-size: 14.6666666666667px; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">/s "

Следующим шагом идем в командную строку и делаем следующие:

Итогом получаем один exe ( alone.exe ) файл, который на самом деле является файлом состоящем из трех частей. Распаковщика ( 7zsd.sfx ), конфига к нему ( config.txt ) и нашего дистрибутива ( dist.7z ).

После запуска, произойдет следующее: во временной директории (TEMP) будет развернут наш дистрибутив и автоматом запустится файл из него ( alone.exe ). Распакованные файлы останутся лежать в (TEMP), если оно нам не надо, то в конфигурационном файле надо добавить ключик delete=директория.

А вообще рекомендую посмотреть справку по модулю 7zsfx на официальном сайте:

Как поменять иконку приложения и описание программы?

Для этого воспользуемся программой Resource Hacker

Все использованные программы могут работать из командной строки и легко принимают разные параметры. Поэтому можно легко сделать bat файл со всем этим процессом (компилятор_всея_пайтон.bat) и запускать по мере необходимости.

Оптимизация: скорость, размер, можно попробовать воспользоваться UPX

Исходный код можно все равно перехватить, например, подсмотрев его во время распаковки архива во временную директорию.

Медленный запуск приложения. (Можно победить подбором параметров сжатия и удалением мусорных файлов из дистрибутива) (А на SSD, так вообще не заметно:) )

Читайте также: