LINUX.ORG.RU

Правильный деплой Python приложения - как лучше?

 


3

3

Есть некое приложение на Python, чисто серверное без GUI (хотя в данном случае не важно). Оно использует ряд модулей.

При разработке и отладке на целевой системе я просто использовал virtualenv. Теперь встал вопрос - как лучше сделать бандл, чтобы его могли:

  1. Ставить люди, не шарящие в кишках питона. Просто брать и ставить.

  2. Ставить в любое место.

  3. Без интернета.

То есть в идеале - надо сделать папку, в которой приложение, и все site-packages которые оно использует. И прямо из этой папки должно все стартовать.

Все что пишут по поводу Python deploy - либо докер, либо virtualenv, либо накатывать через pip пакеты на целевой системе. Это какое-то не то. Как можно сделать проще?

PyInstaller делает то что нужно, но он не подходит потому что заворачивает все в бинарники. Мне надо чтобы py файлы остались и можно было править код по живому.

Можно тащить весь интерпретатор и необходимые библиотеки вместе с программой, запускать через скрипт, который прописывает правильные пути (PYTHONPATH и LD_LIBRARY_PATH). Я так делал для виндовса

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

Ненене, пакет самодостаточный должен быть. Суть в том что все модули и приложение в одной папке.

К тому же, слово папка тут немного намекает на то что там «на любимом дистре». Если ты понимаешь о чем я )) Не хочу явно писать а то тролли набегут.

James_Holden ★★★★
() автор топика

Спроси у геев, они ответят, а здесь одни девственники, они ничего не знают.

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

на винде просто %PATH% для библиотек используется, да

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

Я же написал сразу - без докера

Зря, лишаете себя и других удовольствия.

Ставить люди, не шарящие в кишках питона. Просто брать и ставить.

git clone ...
docker run ...

Profit

Ставить в любое место.

Что там на хосте вообще пофиг.

Без интернета.

Вы это серьёзно?

Ещё, подумайте, какие понадобятся телодвижения для обновления, исправления etc, для докера хватит всего лишь git pull. И появится ваше свободное время от «опакечивания».

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

Тогда делаешь инсталлятор для своего «любимого дистра», рекомендую NSIS. И пихаешь туда python.exe и все зависимости.

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

интересная мысль, можно более развернуто, спасибо

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

Еще раз - надо без интернета, и надо кроссплатформенно. Я лично не против докера совсем, и тем более гита, но в данном случае это только лишние проблемы создает. Особенно на Windows Server 2008 будут рады докеру.

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

Я так и буду делать, вопрос был в том как правильно пихать. Недостаточно пихнуть, надо еще правильно настроить чтобы питон все видел.

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

Тебе ничего не мешает передавать докер образ как файл, если уж такие проблемы с интернетом

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

Особенно на Windows Server 2008 будут рады докеру.

Я не уговариваю, но self-hosted скриптоте со своими зависимостями там рады ещё меньше, кмк.

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

git clone ...
docker run ...

Троеточия зря ставишь, появляется много места для фантазий.

Ещё, подумайте, какие понадобятся телодвижения для обновления, исправления etc, для докера хватит всего лишь git pull

Ага

$ git pull 
error: Your local changes to the following files would be overwritten by merge:
...
Please commit your changes or stash them before you merge.
А дальше «просто» создаешь ветку, «просто» вносишь в нее локальные правки, просто сливаешь свою ветку с мастером.

Но да, в питоне с деплоем всё плохо до сих пор, увы. Недавно было очень плохо, теперь просто «плохо». Без дополнительного софта ничего не сделать. И да, один из вариантов — это кидать юзеру бандл с докером и гитом в комплекте, чтобы он мог просто ткнуть в шелскрипт и получить работающее приложение.

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

нет ничего более кроссплатформенного чем докер образ

Хорошо, а есть инструкция как докер запустить на Windows Server 2008?

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

Ну и да, нет ничего более кроссплатформенного чем докер образ, т.к. платформа таскается с собой

Платформа не таскается с собой, виртуалки нужно ставить на старую винду и мак, не говоря уже про более экзотические платформы.

byko3y ★★★★
()

Для меня работал такой подход, ставил на gentoo/ubuntu16lts:

Подводные камни в целом:

  • прикладные зависимости
    • в setup.py это все прописывалось, но были замечания
  • системные зависимости
    • старая версия python
      • пришлось отказываться от ряда пакетов, их похоже удалили из реп
  • ubuntu51lts
    • пришлось кое-что ставить из snap: отличная штука кстати в целом

Выводы: Python классный, но захотелось попробовать что-то еще:

  • golang
  • rust
  • c++
  • ruby
  • php
anonymous
()
Ответ на: комментарий от byko3y

Погоди, вот есть pyinstaller, и он без всякого докера делает полностью самодостаточный бандл. Значит можно же?

Только мне не нравится что он все в бинарники заворачивает.

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

А дальше «просто» создаешь ветку, «просто» вносишь в нее локальные правки, просто сливаешь свою ветку с мастером.

Ну во-первых, из ОП понятно, что девелопить никто не будет на инстансе.

А потом, просто добавляешь в README.md «Use latest pre-built image from DockerHub» и избавляешься от сырцов на сервере:

docker pull jamesholden/pepyaka
vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от James_Holden

Погоди, вот есть pyinstaller, и он без всякого докера делает полностью самодостаточный бандл. Значит можно же?

Значит можно. Но не питону. Питон нужно заворачивать в дополнительный слой виртуализации, чтобы обойти его бесконечные прорехи архитектуры (ну то есть отсутствия архитектуры). Самодостаточный деплой нынче не в моде.

byko3y ★★★★
()

Ставить в любое место.

Модули pure python или содержат компилируемый код? Во втором случае место будет ограничено операционной системой, а с собой придётся таскать сам питон. В первом должно быть достаточно распаковать virtualenv и сделать source чтототам activate.

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

pure python. Но мне не проблема, допустим, для винды из-под винды упаковать, для линукса с линукса. С такой же версии питона.

virtualenv нельзя просто распаковать, он привязывается к пути на котором создан. В другом месте он не зафурычит после распаковки.

James_Holden ★★★★
() автор топика

переписать на go и распространять скомпилированым

питон неюзабелен как раз из-за сабжевой проблемы

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

Все, сделал. Оказалось все проще пареной репы. Непонятно только почему это не пишут сразу а посылаю в докер. Но один нюанс - это только под виндой. А сапожник сидит без сапог и славит классические репы линукса, из-за которых у нас даже питона блина нету!

Как сделал, может кому пригодится.

  1. Скачиваем embeddable python. Распаковываем прямо в проект в папку python.

  2. Из virtualenv, где шла разработка и стоят все модули, копируем папку site-packages внутрь папки python, созданной в пункте 1.

  3. В стартовом .py файле проекта в самом начале пишем

import sys
import os.path
sys.path.append(os.path.join(os.path.dirname(sys.path[0]), "site-packages"))
sys.path.append(os.path.join(os.path.dirname(sys.path[0]), os.pardir))

Все. Теперь можно запускать приложение python\python myApplication.py. Все полностью переносимо, в любое место на диске.

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

Распространять скомпилированным кстати питоновский проект элементарно, как в линуксе так и в винде. Не знаю что тут неюзабельного.

Я хотел не скомпилированный, и тут с виндой вопрос решился, а с линуксом я пока не понял как.

James_Holden ★★★★
() автор топика

У меня virtualenv, docker у нас пока боятся.

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

virtualenv нельзя просто распаковать, он привязывается к пути на котором создан. В другом месте он не зафурычит после распаковки.

И правда, извиняюсь.

Говорят, против этого есть костыли: https://aarongorka.com/blog/portable-virtualenv/

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

Ну в принципе так добиться того что надо можно.

James_Holden ★★★★
() автор топика

Без интернета.

wheel спокойно ставятся без интернета. Скачиваешь .whl в ./py_modules/, а потом

pip install --no-index --find-links=./py_modules/ module1 module2 ... moduleN

Ставить в любое место.

ИМХО, сделать скрипт, который сам создаст virtualenv, поставит туда модули и закинет в /usr/local/bin/ wrapper для запуска всей этой фигни

Но вообще, если в модулях чистый питон (который не надо линковать с библиотеками), то достаточно распаковать их в каталог с твоим приложением. Питон ищет модули в т.ч. в каталоге с приложением.

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

Под линукс хорошо подошел бы appimage, но чтобы в него питон завернуть - нужно покорячится.

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

@byko3y @Sahas @Harald

Всем спасибо, проблема решена.

На винде - решает embeddable python, как тут

Правильный деплой Python приложения - как лучше? (комментарий)

На линуксе - все то же самое, вместо embeddable python - python-appimage. Можно так:

  1. В папку с проектом кладем python-appimage нужной версии.

  2. Из virtualenv копируем site-packages в папку с проектом.

  3. В начало стартового .py

import sys
import os.path
sys.path.append(os.path.join(os.path.dirname(__file__), "site-packages"))

Готово! Даже на системе без питона должно работать, прямо из папки, из любого места.

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

Я хотел не скомпилированный, и тут с виндой вопрос решился, а с линуксом я пока не понял как

В списках рассылки python.org недавно было обсуждение на эту тему, но я не осилил, потому что там большую часть треда идет классическое юниксоидное «вам это было не нужно»:

https://mail.python.org/archives/list/python-ideas@python.org/thread/MCIPDY7E...

Если кто-то осилит прочитать и вынести все-таки полезные мысли оттуда — буду благодарен.

Мне вспомнился Торвальдс, который лет так восемь назад на лекции говорил ровно про то же — под линь нереально распространять бинари. Сказано — сделано, и теперь докер работает под любым линем начиная с 3.10 независимо от остальной системы.

byko3y ★★★★
()

Запаковать его в deb или rpm. Остальные извращенства оставь извращенцам. Если приложение очень часто обновляется, например, зависит от веб-сервиса, то через pip

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

Тогда просто в папочку и в архив tar.xz. И батник для запуска под виндовс и shell скрипт для линуксов

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

ИМХО, сделать скрипт, который сам создаст virtualenv, поставит туда модули и закинет в /usr/local/bin/ wrapper для запуска всей этой фигни

Проблема скрипта в том, что ему нужна конкретный диапазон версий питона. То есть, ты уже должен передавать в дистре конкретный бинарь питона, а потому все эти дополнительные телодвижения имеют мало смысла. По-хорошему на python.org должен лежать статически линкованный бинарь с единственным требованием «linux kernel 3.10+».

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

Специально для нечитателей треда - вечерний повтор выпуска.

Писал же в начале, что нужно без интернета, нужно в основном на винду, приложение не для пользователей. Оно вообще для производства.

Так что rpm и deb пролетают (да я и не стал бы в них паковать никогда, я их люто ненавижу до истерик, но тут они объективно не подходят).

pip не подходит потому что нет интернета. Хотя можно whl использовать, но это лишняя возня.

Все решает python-appimage или embeddable python на винде, который просто кладется в папку с проектом и все. Не нужно ни докеров (в данном случае, в целом я не против него), ни идиотских линуксовых пакетов.

И не нужно вступать в клуюб мазохистов, чтобы делать deb и rpm и считать что так и надо.

James_Holden ★★★★
() автор топика

Я сейчас грязи на советую, но если тебе по-быстрому и для своих, то.

Нормальный requirements.txt, раскатка venv скриптом. Как доносить до пользователя — сам придумывай, да хоть в пакет упаковывай и мусори в /opt

UPD: а, без интернета и винду. Я cx_freeze юзал, вроде нормально.

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

Если на целевой машине Python уже установлен, то правильный официальный вариант — zipapp.

https://docs.python.org/3/library/zipapp.html

Zipapp соберет файл .pyz, содержащий внутри код и модули, который можно запустить любым python-интерпретатором.

Если не установлен, то pyinstaller должен подойти, см., например, https://github.com/ValdikSS/blockcheck

https://github.com/ValdikSS/blockcheck/releases/tag/0.0.9.8

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

zipapp

Класс, а как туда вовнутрь модули из pip пихать? И можно ли?

то pyinstaller должен подойти

В целом да, но я хочу чтобы были доступны файлы как скрипты, а не все заворачивалось в бинарники. К тому же pyinstaller ломает некоторый код.

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