LINUX.ORG.RU

Сборка AppImage для программ на Python3

 ,


1

1

Привет всем!

Мне уже удавалось собирать код на Python3 с помощью cx-freeze или pyinstaller, но мне хотелось бы собрать AppImage для всех линуксовых дистрибутивов. Оставить в исходном коде - не совсем вариант. Запуск питона со всеми pip-зависимостями и (иногда) исправленными багами в site-packages для новичка нелегок будет. Заморачиваться с пакетированием под все основные системы не очень хочется, решил остановиться на AppImage.

Как я это делаю сейчас:

1) запускаю cx_freeze/pyinstaller, получаю каталог с бинарниками.

2) Создаю usr/bin, перемещаю бинарники в него

3) Копирую в текущий каталог AppRun (ELF), MyApp.desktop, MyApp.png.

4) Делаю

strace -eopen -f ./AppRun 2>&1 | grep / | grep -v ENOENT | cut -d "\"" -f 2 | sort | uniq > copyfiles
Это находит все используемые в системе файлы.

5) Удаляю из copyfiles то, что, скорее всего, копировать не нужно (/etc/passwd, /dev/null и т.д.).

6) Копирую в каталог с AppRun файлы из copyfiles, принимая текущий каталог за /. Т.е., /lib/somelib.so -> ./lib/somelib.so, /etc/fonts/somefont -> ./etc/fonts/somefont и т.д.

7) Для каталога с AppRun применяю appimagetool, он собирает AppImage.

Проблема в том, что такая сборка использует как локальные, так и системные файлы. Например, после запуска на другой ОС я получаю segmentation fault, но после удаления из ./lib libgc, libpthread и lipdl, программа запускается. Т.е., какие-то библиотеки из ./lib используются. Однако, не используются шрифты из ./etc/fonts - я получаю сообщения об ошибках (обращение, по всей видимости, по-прежнему идет к /etc/fonts), на некотых ОС я получаю квадраты.

Также проблема с сертификатами, получаю ошибку SSL: CERTIFICATE_VERIFY_FAILED. Иногда помогает установка ca_certificates, но на разных ОС сертификаты находятся в РАЗНЫХ каталогах! ЕМНИП, для centos - /etc/pki/tls, для debian - /etc/ssl/certs, для TinyCore - /usr/local/etc/ssl/certs. После создания /etc/pki/tls/cert.pem программа, собранная на centos, завелась на debian. Однако, ни сборка на centos, ни сборка на debian8 не завелась полностью на TinyCore - CERTIFICATE_VERIFY_FAILED и квадраты вместо кириллицы.

В общем, вопрос: как грамотно сделать сборку? Может, требуется пропатчить libpython в сборке (если там есть жесткая привязка к системным файлам)?

P.S. Я знаю про существование yml и TravisCI, но я пока не понял, что оно делает, какого рода скрипты можно вставить в yml и что вообще получается на выходе. Хочется пока руками, чтобы разобраться.

★★★★★

Ответ на: комментарий от leave

Проблема начинается когда 3D ускорение и надо DRI и вот это все пробрасывать. Пробросить иксы и пульсу очень легко.

Но возможно у ТСа речь не идет о гуе

vertexua ★★★☆☆ ()
Последнее исправление: vertexua (всего исправлений: 1)

Заморачиваться с пакетированием под все основные системы не очень хочется, решил остановиться на AppImage.

А вот если бы остановился на Flatpak, то у тебя бы на всех системах сертификаты лежали в одном каталоге, библиотеки бы были одинаковые и шрифты были бы одинаковые.

proud_anon ★★★★★ ()
Ответ на: комментарий от proud_anon

А я flatpak/snap еще не пробовал. Судя по описанию, они изолируют выполняемый код от окружения, но мне нужна определенная интеграция: запись конфига, сохранение файлов, вызов внешних программ (медиаплееры, браузеры, текстовые редакторы и т.п.)

denton ★★★★★ ()
Ответ на: комментарий от gasinvein

Вот я задумался... А для чего эти надстройки вообще нужны, помимо изоляции? Если я упакую бинарники в tar.bz2, у них что, меньшая вероятность запуститься по сравнению с AppImage/Flatpak/Snap? Удобство использования? Ну так для AppImage, например, надо еще chmod +x сделать и fuse установить, желательно, не сверхстарой версии.

denton ★★★★★ ()
Последнее исправление: denton (всего исправлений: 1)
Ответ на: комментарий от denton

Если я упакую бинарники в tar.bz2, у них что, меньшая вероятность запуститься по сравнению с AppImage/Flatpak/Snap?

Вообще-то, да. Цель самодостаточных приложений в, эм, самодостаточности. Одно и то же приложение с одинаковой средой исполнения для всех дистрибутивов.
Этим, кстати, AppImage отличается от Flatpak/Snap - он позволяет только напихать зависимостей в бандл, но средой исполнения всё равно будет являться ОС хоста.

gasinvein ★★★ ()
Ответ на: комментарий от denton

Советую смотреть в сторону только Flatpak. Де-факто, Snap поддерживается только в убунте, в то время как Flatpak везде, включая убунту. Пруф.

gasinvein ★★★ ()
Последнее исправление: gasinvein (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Если тебе принципиально, можешь использовать org.freedesktop.Platfоrm, и поставлять Qt в составе бандла. Cэкономишь свои байты, добавив себе работы. Это с учетом того, что если у пользователя другой кутешный софт стоит через флатпак, то кдешный рантайм у него скорее всего будет, потому как это распространенная практика.

anonymous ()
Ответ на: комментарий от RazrFalcon

Могу ли я распространять прогу на Qt?

Ты разрешения спрашиваешь или технической возможности? Технически можно распространить любую прогу, не требующую повышения привилегий.

KDE SDK, но оно жирное

Оно общее для всех программ, его использующих. Но можно и Qt самому собрать и засунуть в бандл, если хочется, да.

gasinvein ★★★ ()