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 и что вообще получается на выходе. Хочется пока руками, чтобы разобраться.

Deleted

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

Пересобрал с помощью pyinstaller. Не помогло - по-прежнему квадраты вместо кириллицы и CERTIFICATE_VERIFY_FAILED.

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

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

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

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

существуют сборки только для платформ x86-64 и ARM

У меня пока x86.

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

TinyCore. Проверяю на этой ОС, чтобы убедиться, что все библиотеки на месте.

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

Решил проблему CERTIFICATE_VERIFY_FAILED (обходным способом?) так:

locate ca-bundle.crt

export SSL_CERT_FILE=LOCATED_PATH

Квадраты остались, правда, они только на TinyCore.

Deleted
()

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

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

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

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

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

запись конфига, сохранение файлов, вызов внешних программ (медиаплееры, браузеры, текстовые редакторы и т.п.)

Это всё Flatpak умеет.

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

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

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

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

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

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

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

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

Хромиум не умеет, точнее конфликтует с его песочницей. Хотя уже для этого предложили решение через порталы.

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

но оно жирное

Ведь в этом и суть: программы используют один SDK и Platform. Ты, конечно, можешь наплодить свои версии SDK и Platform, но только зачем?

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

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

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

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

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

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

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

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

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

И чем это тогда отличается от tar.gz? Я просто не понимаю смысла в этих контейнерах.

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

Например, тем, что Flatpak предоставляет полностью независимую от ОС хоста среду выполнения.

gasinvein ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.