Как уменьшить размер exe файла python
Кроме этого, я предполагаю, что практика делает прекрасным. И читайте обо всем, что можно найти о потенциальных проблемах, на которые можно наткнуться. Используя файлы сброса, корректный 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-приложение и все необходимые ему библиотеки следующим образом:
- Считывает файл скрипта.
- Анализирует код для выявления всех зависимостей, необходимых для работы. spec, который содержит название скрипта, библиотеки-зависимости, любые файлы, включая те параметры, которые были переданы в команду PyInstaller.
- Собирает копии всех библиотек и файлов вместе с активным интерпретатором Python.
- Создает папку BUILD в папке со скриптом и записывает логи вместе с рабочими файлами в BUILD.
- Создает папку DIST в папке со скриптом, если она еще не существует.
- Записывает все необходимые файлы вместе со скриптом или в одну папку, или в один исполняемый файл.
Если использовать параметр команды onedir или -D при генерации исполняемого файла, тогда все будет помещено в одну папку. Это поведение по умолчанию. Если же использовать параметр onefile или -F , то все окажется в одном исполняемом файле.
Возьмем в качестве примера простейший скрипт на Python c названием simple.py, который содержит такой код.
Создадим один исполняемый файл. В командной строке введите:
После завершения установки будет две папки, BUILD и DIST, а также новый файл с расширением .spec. Spec-файл будет называться так же, как и файл скрипта.
Python создает каталог распространения, который содержит основной исполняемый файл, а также все динамические библиотеки.
Вот что произойдет после запуска файла.
Также, открыв spec-файл, можно увидеть раздел datas, в котором указывается, что файл netflix_titles.csv копируется в текущую директорию.
Запустим файл simple1.exe, появится консоль с выводом: Всего фильмов: 7787 .
Добавление файлов с данными и параметр onefile
Скрипт обновлен для чтения папки TEMP и файлов с данными. Создадим exe-файл с помощью onefile и add-data.
После успешного создания файл simple1.exe появится в папке DIST.
Можно скопировать исполняемый файл на рабочий стол и запустить, чтобы убедиться, что нет никакой ошибки, связанной с отсутствием файла.
Дополнительные импорты с помощью 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, так вообще не заметно:) )
Читайте также: