Сайт | Скачать | Видео | Wiki

Автор Тема: Pyinstaller , Nuitka - компиляция python скрипта в bin : youtube-dl  (Прочитано 1392 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 32840
  • Репутация: +222/-0
  • Автор темы
    • PuppyRus-A
Т.е. на выходе получаем один бинарник, который работает без python в любом линуксе (если вы специально не выкинули из него системные либы - см. ниже)
Есть версии под python2 (бинарник получается меньше) и python3

Уменьшение размера бинарника :
1. Компилим в папку : pyinstaller -D ваш.py
2. Заходим в dist/ваш и методом исключения убираем лищнее
3. Правим ваш.spec - пример в аттаче
4. Компилим в бинарник pyinstaller -D ваш.py - пример в аттаче
На примере youtube-dl - размер удалось уменьшить почти в 2 раза

Плюсы :
1. Удобно для распространения в разных дистрибах
2. Бинарник работает быстрее, чем скрипт
Код
# time ./youtube-dl -s https://www.youtube.com/watch?v=aTTx5WsswPM
real 0m3,858s
user 0m2,857s
sys 0m0,186s
root@pra-roll:1# time ./youtube-dl -s https://www.youtube.com/watch?v=aTTx5WsswPM
real 0m2,209s
user 0m1,365s
sys 0m0,080s

Минусы :
1. Скомпилить получится не все что угодно (или надо очень уметь)
2. Размер может получиться очень большим. Программа с GUI на python3 получается юольше 100мб

Пример:
https://forum.puppyrus.org/index.php?topic=20811.msg172892#msg172892
https://mirror.yandex.ru/puppyrus/roll/pkg/roll/pkg/2008 - pyinstaller и пр. пакеты для prar20.08 на которых можно поэкспериментировать
youtube-dl-bin-p-20.11.21_64-sf01.pfs - оптимизированный бинарник

Другой компилятор Nuitka
« Последнее редактирование: 15 Ноябрь 2021, 14:17:06 от sfs »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 32840
  • Репутация: +222/-0
  • Автор темы
    • PuppyRus-A

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 4865
  • Репутация: +126/-1
Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
« Ответ #2 : 10 Ноябрь 2021, 00:48:34 »
А i686 можете скомпилить?
Я говорил ранее, что желательно добавить pyinstaller в DEVX, и тогда сборка проще простого - подключение devx и клик по скрипту.


Поменьше его не сделать?
1. exclude_system_libraries
Уменьшится где-то на 3 mb.
2. PYTHONOPTIMIZE=2 pyinstaller myscript.py
Еще уменьшение примерно на 0.5 MB.

В шапке темы прикреплен образец youtube-dl.spec.gz. Сборка командой pyinstaller yt-dlp.spec.


Pyinstaller при сборке создает youtube-dl.spec, где можно настроить исключения, если знать что именно и тем самым уменьшить размер конечного youtube-dl.

Т.е. сначала создаем pyi-makespec --onefile __main__.py --name youtube-dl, редактируем *.spec и собираем pyinstaller youtube-dl.spec.
Ссылка.
« Последнее редактирование: 10 Ноябрь 2021, 15:47:16 от krasnyh »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 32840
  • Репутация: +222/-0
  • Автор темы
    • PuppyRus-A
Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
« Ответ #3 : 10 Ноябрь 2021, 09:24:59 »
Я правильно понял - под питон2 он не работает?

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 4865
  • Репутация: +126/-1
Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
« Ответ #4 : 10 Ноябрь 2021, 15:50:29 »
Цитата
DEPENDENCIES

Python versions 3.6+ (CPython and PyPy) are supported. Other versions and implementations may or may not work correctly.
https://github.com/yt-dlp/yt-dlp#dependencies


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

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 32840
  • Репутация: +222/-0
  • Автор темы
    • PuppyRus-A
Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
« Ответ #5 : 12 Ноябрь 2021, 14:14:58 »
Скомпилил для i686
Рецепты уменьшения размера (см. выше) не помогли. 1 - не собирается
2 - нерабочий бинарник
youtube-dl-2021.11.10_any-sf01.pfs

pyinstaller-4.7-2-i686.pkg.tar.xz
pyinstaller-git-5.0.dev0.r8200.gf0f63da7c-1-i686.pkg.tar.xz
pyinstaller-hooks-contrib-2021.3-2-any.pkg.tar.xz
pyinstaller-hooks-contrib-git-2021.4.r266.g1cbfd2c-1-any.pkg.tar.xz
python-altgraph-0.17-1-any.pkg.tar.xz

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 4865
  • Репутация: +126/-1
Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
« Ответ #6 : 12 Ноябрь 2021, 14:26:39 »
Рецепты уменьшения размера (см. выше) не помогли. 1 - не собирается
Ну я тоже не сразу осилил как правильно прописать. Кусок yt-dlp.spec:
Цитата

a = Analysis(['__main__.py'],   
             pathex=[],   
             binaries=[],   
             datas=[],   
             hiddenimports=[],   
             hookspath=[],   
             hooksconfig={},   
             runtime_hooks=[],   
             excludes=[],   
             win_no_prefer_redirects=False,   
             win_private_assemblies=False,   
             cipher=block_cipher,   
             noarchive=False)   
a.exclude_system_libraries(list_of_exceptions=[])   
pyz = PYZ(a.pure, a.zipped_data,   
             cipher=block_cipher)

Для отладки можно сначала собирать в папку с --onedir, там будет видно, что из либ остается только libpython*.so.1.0.

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 32840
  • Репутация: +222/-0
  • Автор темы
    • PuppyRus-A
Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
« Ответ #7 : 15 Ноябрь 2021, 14:15:50 »
Скомпилил свежий. Скрипт компиляции в модуле в /opt
089-lfd10-upd-sf61.pfs - необходим - так симлинк на libffi
youtube-dl-2021.11.10_any-sf01.pfs

pyinstaller-4.7-2-x86_64.pkg.tar.xz
pyinstaller-4.7-2-2110-sf01.pfs

Другой компилятор Nuitka
У меня с ним не скомпилилось

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 4865
  • Репутация: +126/-1
Yt-dlp начал выпускать бинарные сборки для linux (29.1 MB; python3.10).

Размер конечно больше, чем при нашей компиляции с Pyinstaller, но зато самому не надо собирать. Подойдет тем, кому не нужен python в системе, плюс бинарник отрабатывает чуть быстрее, чем python-скрипт (не в данном случае).


*бинарник со статическими либами
« Последнее редактирование: 22 Июнь 2022, 07:48:29 от krasnyh »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 32840
  • Репутация: +222/-0
  • Автор темы
    • PuppyRus-A
Yt-dlp начал выпускать бинарные сборки для linux
https://github.com/yt-dlp/yt-dlp/releases/download/2022.06.22.1/yt-dlp_linux
Больше нашего в 3 раза, тормознее на 1 сек
Наш , хоть и от 2021.11.10, но до сих пор работает. У всех так?
Получвается в маленьние дистры лучше наш, а в прар yt-dlp_linux. Сделаю автообновлялку

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 32840
  • Репутация: +222/-0
  • Автор темы
    • PuppyRus-A

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 4865
  • Репутация: +126/-1
Больше нашего в 3 раза
В yt-dlp_linux, в питоновскую либу впихнули наверно все что можно и нельзя, в сравнении с арч-пакетом python-3.10. Разница 19 mb против 3,7 mb:
Код
live@roll2110 /mnt/sda3/Загрузки/yt-dlp_linux % lh libpython3.10.so.1.0
-rwxr-xr-x 1 live live 19M июн 22 04:15 libpython3.10.so.1.0

live@roll2110 /mnt/sda3/Загрузки/yt-dlp_linux % cd /home/live/Загрузки/python-3.10.5-1-x86_64.pkg/usr/lib
live@roll2110 ..зки/python-3.10.5-1-x86_64.pkg/usr/lib % lh libpython3.10.so.1.0
-rwxr-xr-x 1 live live 3,7M июн  6 21:49 libpython3.10.so.1.0

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 32840
  • Репутация: +222/-0
  • Автор темы
    • PuppyRus-A
В итоге этот вариант оптимальный. вместе с питоном из дистра занимает меньше места. Наверное и под i686 будет работать. Родной дистру питон полезнее специализированного
yt-dlp-git-p-_64-au01.pfs - это , вместе с питоном пойдет в прар
yt-dlp-git-2022.06.22.1-1-x86_64.pkg.tar.xz