Как тащить за собой питон?

с++ программа вызывает питон скрипты через pybind, но питон там должен быть особенный ( с правильным набором библиотек ). На винде я просто копирую папку с питоном в папку с проектом -_-. Как поступать с линуксом? есть ли там такой же (embeddable) питон, как на винде, чтобы его можно было положить в корень проекта, или я категорически делаю что-то не так?


Ответы (2 шт):

Автор решения: eri

Python после 3.9, возможно после 3.5 - точно не уверен, вполне портабельный:

Создай папочку, копирни сам язык:

mkdir python-portable
cd python-portable/
mkdir lib/ bin/
cp /usr/bin/python3 ./bin/
cp /usr/lib/libpython3.so ./lib/

Стандартные либы

cp -r /usr/lib/python3.9 ./lib/

Но выкинем site-packages чтоб не путаться (в убунтах есть ещё dist-packages):

rm ./lib/python3.9/site-packages -rf
mkdir ./lib/python3.9/site-packages

Вот питон рабочий

./bin/python3
>>> import site
>>> site.PREFIXES
['/tmp/python-portable', '/tmp/python-portable']
>>> site.getsitepackages()
['/tmp/python-portable/lib/python3.9/site-packages']

Теперь менеджер либ, ставится очень легко:

./bin/python3 -m ensurepip

Если есть папка site.getuserbase(), то её временно переименуй, чтоб все зависимости упали в каталог site-packages:

mv  ~/.local/lib/python3.9  ~/.local/lib/python3.9.bak

И можно ставить свои зависимости:

./python3 -m pip install pybind11
ls lib/python3.9/site-packages/

Не забудь вернуть на место:

mv  ~/.local/lib/python3.9.bak  ~/.local/lib/python3.9

П.С. Ваш питон не запустится на системах со старой glibc - если нужна поддержка убунты 16.04 ,например, то ставьте 16.04, там из исходников собираете нужную версию и установите его с префиксом в отдельной папочке - это будет проще, но дольше. Такая сборка запустится на большинстве линуксов. Это справедливо и для сишной части программы.

→ Ссылка
Автор решения: Sheridan

Предложенный выше вариант в корне неверен как идеологически, так и техничеки.

  1. Питон и его библиотеки не будут сопровождаться (патчи безопасности, обновления). Точнее постольку-поскольку, лишь бы работало.
  2. Система будет не в курсе, что гдето есть питон и его библиотеки. Будет мешать, например устанавливая другие версии библиотек в стандартные пути.
  3. Непортабельно. Будет слабо переносимо между дистрибутивами из-за, например, упомянутых выше разных версий glibc
  4. Будет установлено куда-то мимо стандартных путей и образует свой root, для которого админам придётся настраивать свой бекап, свой логротейт и так далее.

Как правильно?

  1. Ориентироваться на текущий stable питон в выбранных дистрибутивах. Точно так-же и с его библиотеками.
  2. Свой код опакетить, указав в зависимостях пакетов нужные версии питона и либ.
  3. Поднять свои репозитории, куда выкладывать свои пакеты, дав людям возможность не только просто подключать репозиторий и устанавливать одной стандартной командой всё нужное, но и обновлять штатно.

Смысл в том, что в системе уже есть манагер пакетов, который занимается установкой/удалением софта и зависимостей. Не нужно заставлять человека быть манагером пакетов, выкачивая руками, распаковывая и что там еще делать надо. Не нужно даже заставлять устанавливать второй/третий манагер пакетов (pip, npm, cargo и так далее). Они будут мешать друг другу, что со временем выльется в непонятные сбои.

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

Я всё сказал.

→ Ссылка