Ответ 1
попробуйте настроить вашу среду с помощью virtualenv и установить туда только необходимые библиотеки
некоторые подробности о работе с виртуальной средой находятся здесь: https://virtualenv.pypa.io/en/stable/
У меня есть простой pandas pyinstaller exe, который превышает 40 МБ.
Мой пример exe:
import collections
import csv
import selenium
import pandas
print('hi')
40MB + для этого кажется немного переборщиком.
Как я могу уменьшить это как можно больше?
Один метод:
pyinstaller --onefile --exclude matplotlib --exclude scipy --exclude pandas --exclude numpy.py
Это, однако, нецелесообразно, учитывая, насколько большой будет список исключений.
Как выбрать папку для pyinstaller для получения модулей и исключить все остальное, чтобы у меня могло быть небольшое приложение?
Файл спецификации:
a = Analysis(['123.py'],
pathex=['C:\\Users\\AA\\ZZ'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='123',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
Это также стоит упомянуть. По умолчанию Pyinstaller не обнаруживает pandas.
Добавить
hiddenimports = ['pandas._libs.tslibs.timedeltas']
To: C:\Users\<NAME>\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyInstaller\hooks
Возможное решение при использовании нескольких исполняемых файлов может заключаться в том, чтобы связать каждый исполняемый файл с отдельной папкой или исполняемым файлом со всеми импортируемыми.
попробуйте настроить вашу среду с помощью virtualenv и установить туда только необходимые библиотеки
некоторые подробности о работе с виртуальной средой находятся здесь: https://virtualenv.pypa.io/en/stable/
Я чувствую, что оба этих ответа превосходны.
Для меня это простой пример использования pandas, что exe огромен.
Хотя удаление некоторых каталогов было полезным, как и UPXING, это также помогло.
Я немного уменьшил его, и по умолчанию он не делал этого.
Говоря об этом, здесь обсуждается последнее и наиболее импортное решение: Импорт модулей Python из выбранного местоположения. Таким образом, была функция, которая сделала все это, но на данный момент существует некоторая ручная обработка, потому что: разбиты пакеты с несколькими пакетами.
Теперь к простому решению для большого количества exe
Если у вас много исполняемых файлов, я настоятельно рекомендую этот подход:
pyinstaller -F abc.py --onedir (Have all imports of both scripts)
pyinstaller -F abd.py --onedir (Have all imports of both scripts)
Теперь поместите файл abd.exe в один каталог папки abc.py, а также любые другие внешние скрипты. Убедитесь, что они по-разному названы или запускается только один script.
Это работает очень хорошо, потому что все зависимости находятся в одной папке. Так оно и должно быть. Таким образом, в этом примере говорится, что у вас есть папка размером 40 МБ. Для каждого дополнительного exe после этого он будет равен + 5mb (или насколько большой exe), а не 40mb каждый.
В исполняемый файл включен интерпретатор python и все импортированные модули.
Вы можете попробовать добавить модули, которые хотите исключить, в список excludes
в Analysis
в вашем файле spec.
Вы также можете попробовать сжать исполняемый файл, используя UPX. См. Заметка об использовании UPX
Я использую среду Anaconda, поэтому решение virtualenv не подходит. Мой способ состоял в том, чтобы исключить ненужные модули в моем файле спецификации, например:
в анализе (...)
excludes=['pandas', 'numpy'],
(это модули, которые необычайно увеличивают размер файлов)
Для каждой сборки я использую этот скорректированный spec файл для создания exe файла.
pyinstaller "mySpec.spec" --distpath="<path>"