Форум проекта PuppyRus Linux

Разработки проекта PuppyRus => Программирование и компиляция => Тема начата: sfs от 23 Ноябрь 2020, 11:01:20

Название: Pyinstaller , Nuitka - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 23 Ноябрь 2020, 11:01:20
Т.е. на выходе получаем один бинарник, который работает без 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 (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pfs-portable/youtube-dl-bin-p-20.11.21_64-sf01.pfs) - оптимизированный бинарник

Другой компилятор Nuitka (https://www.opennet.ru/opennews/art.shtml?num=56152)
Название: Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 26 Ноябрь 2020, 10:07:44
pyinstaller-4.1-2008-sf01.pfs (http://mirror.yandex.ru/puppyrus/roll/2008/pfs/pyinstaller-4.1-2008-sf01.pfs)
Название: Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
Отправлено: krasnyh от 10 Ноябрь 2021, 00:48:34
А i686 можете скомпилить?
Я говорил ранее, что желательно добавить pyinstaller в DEVX, и тогда сборка проще простого - подключение devx и клик по скрипту (https://forum.puppyrus.org/index.php?topic=20811.msg180081#msg180081).


Поменьше его не сделать?
1. exclude_system_libraries  (https://pyinstaller.readthedocs.io/en/stable/spec-files.html#posix-specific-options)
Уменьшится где-то на 3 mb.
2. PYTHONOPTIMIZE=2 pyinstaller myscript.py (https://pyinstaller.readthedocs.io/en/stable/usage.html#running-pyinstaller-with-python-optimizations)
Еще уменьшение примерно на 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.
Ссылка (https://habr.com/ru/sandbox/143934/).
Название: Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 10 Ноябрь 2021, 09:24:59
Я правильно понял - под питон2 он не работает?
Название: Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
Отправлено: krasnyh от 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


Можно взять старый (https://wiki.archlinux.org/title/Python#Old_versions) питон, позволит еще чуть уменьшить размер.
Название: Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 12 Ноябрь 2021, 14:14:58
Скомпилил для i686
Рецепты уменьшения размера (см. выше) не помогли. 1 - не собирается
2 - нерабочий бинарник
youtube-dl-2021.11.10_any-sf01.pfs (http://mirror.yandex.ru/puppyrus/puppyrus-a/pra03/pfs-portable/youtube-dl-2021.11.10_any-sf01.pfs)

pyinstaller-4.7-2-i686.pkg.tar.xz (http://mirror.yandex.ru/puppyrus/puppyrus-a/pra03/pra03-extra/pyinstaller-4.7-2-i686.pkg.tar.xz)
pyinstaller-git-5.0.dev0.r8200.gf0f63da7c-1-i686.pkg.tar.xz (http://mirror.yandex.ru/puppyrus/puppyrus-a/pra03/pra03-extra/pyinstaller-git-5.0.dev0.r8200.gf0f63da7c-1-i686.pkg.tar.xz)
pyinstaller-hooks-contrib-2021.3-2-any.pkg.tar.xz (http://mirror.yandex.ru/puppyrus/puppyrus-a/pra03/pra03-extra/pyinstaller-hooks-contrib-2021.3-2-any.pkg.tar.xz)
pyinstaller-hooks-contrib-git-2021.4.r266.g1cbfd2c-1-any.pkg.tar.xz (http://mirror.yandex.ru/puppyrus/puppyrus-a/pra03/pra03-extra/pyinstaller-hooks-contrib-git-2021.4.r266.g1cbfd2c-1-any.pkg.tar.xz)
python-altgraph-0.17-1-any.pkg.tar.xz (http://mirror.yandex.ru/puppyrus/puppyrus-a/pra03/pra03-extra/python-altgraph-0.17-1-any.pkg.tar.xz)
Название: Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
Отправлено: krasnyh от 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.
Название: Re: Pyinstaller - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 15 Ноябрь 2021, 14:15:50
Скомпилил свежий. Скрипт компиляции в модуле в /opt
089-lfd10-upd-sf61.pfs (http://mirror.yandex.ru/puppyrus/lf/d10/pfs/089-lfd10-upd-sf61.pfs) - необходим - так симлинк на libffi
youtube-dl-2021.11.10_any-sf01.pfs (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pfs-portable/youtube-dl-2021.11.10_any-sf01.pfs)

pyinstaller-4.7-2-x86_64.pkg.tar.xz (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pra64-07/pkg/pra6407extra/pyinstaller-4.7-2-x86_64.pkg.tar.xz)
pyinstaller-4.7-2-2110-sf01.pfs (http://mirror.yandex.ru/puppyrus/roll/2110/pfs/pyinstaller-4.7-2-2110-sf01.pfs)

Другой компилятор Nuitka (https://www.opennet.ru/opennews/art.shtml?num=56152)
У меня с ним не скомпилилось
Название: Re: Pyinstaller , Nuitka - компиляция python скрипта в bin : youtube-dl
Отправлено: krasnyh от 22 Июнь 2022, 07:37:07
Yt-dlp начал выпускать бинарные сборки для linux (29.1 MB; python3.10).

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


*бинарник со статическими либами
Название: Re: Pyinstaller , Nuitka - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 23 Июнь 2022, 11:30:12
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. Сделаю автообновлялку
Название: Re: Pyinstaller , Nuitka - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 23 Июнь 2022, 15:45:06
в прар yt-dlp_linux. Сделаю автообновлялку
yt-dlp-bin_64-au01.pfs (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pfs-portable/yt-dlp-bin_64-au01.pfs)
089-upd-2110-sf41.pfs (http://mirror.yandex.ru/puppyrus/roll/2110/pfs/089-upd-2110-sf41.pfs)
yt-dlp-bin-2022.06.22.1-1-x86_64.pkg.tar.xz (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pra64-07/pkg/pra6407extra/yt-dlp-bin-2022.06.22.1-1-x86_64.pkg.tar.xz)
Название: Re: Pyinstaller , Nuitka - компиляция python скрипта в bin : youtube-dl
Отправлено: krasnyh от 23 Июнь 2022, 21:52:29
Больше нашего в 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
Название: Re: Pyinstaller , Nuitka - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 27 Июнь 2022, 11:03:13
В итоге этот (http://этот) вариант оптимальный. вместе с питоном из дистра занимает меньше места. Наверное и под i686 будет работать. Родной дистру питон полезнее специализированного
yt-dlp-git-p-_64-au01.pfs (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pfs-portable/yt-dlp-git-p-_64-au01.pfs) - это , вместе с питоном пойдет в прар
yt-dlp-git-2022.06.22.1-1-x86_64.pkg.tar.xz (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pra64-07/pkg/pra6407extra/yt-dlp-git-2022.06.22.1-1-x86_64.pkg.tar.xz)
Название: Re: Pyinstaller , Nuitka - компиляция python скрипта в bin : youtube-dl
Отправлено: sfs от 05 Июль 2022, 11:46:46
Переделал обновляторы с исправлением ошибок и обновил
yt-dlp-bin-p-2022.06.29_64-au01.pfs (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pfs-portable/yt-dlp-bin-p-2022.06.29_64-au01.pfs)
yt-dlp-git-p-2022.06.29_64-au01.pfs (http://mirror.yandex.ru/puppyrus/puppyrus-a64/pfs-portable/yt-dlp-git-p-2022.06.29_64-au01.pfs)