Как тащить за собой питон?
с++ программа вызывает питон скрипты через pybind, но питон там должен быть особенный ( с правильным набором библиотек ). На винде я просто копирую папку с питоном в папку с проектом -_-. Как поступать с линуксом? есть ли там такой же (embeddable) питон, как на винде, чтобы его можно было положить в корень проекта, или я категорически делаю что-то не так?
Ответы (2 шт):
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, там из исходников собираете нужную версию и установите его с префиксом в отдельной папочке - это будет проще, но дольше. Такая сборка запустится на большинстве линуксов. Это справедливо и для сишной части программы.
Предложенный выше вариант в корне неверен как идеологически, так и техничеки.
- Питон и его библиотеки не будут сопровождаться (патчи безопасности, обновления). Точнее постольку-поскольку, лишь бы работало.
- Система будет не в курсе, что гдето есть питон и его библиотеки. Будет мешать, например устанавливая другие версии библиотек в стандартные пути.
- Непортабельно. Будет слабо переносимо между дистрибутивами из-за, например, упомянутых выше разных версий glibc
- Будет установлено куда-то мимо стандартных путей и образует свой root, для которого админам придётся настраивать свой бекап, свой логротейт и так далее.
Как правильно?
- Ориентироваться на текущий stable питон в выбранных дистрибутивах. Точно так-же и с его библиотеками.
- Свой код опакетить, указав в зависимостях пакетов нужные версии питона и либ.
- Поднять свои репозитории, куда выкладывать свои пакеты, дав людям возможность не только просто подключать репозиторий и устанавливать одной стандартной командой всё нужное, но и обновлять штатно.
Смысл в том, что в системе уже есть манагер пакетов, который занимается установкой/удалением софта и зависимостей. Не нужно заставлять человека быть манагером пакетов, выкачивая руками, распаковывая и что там еще делать надо. Не нужно даже заставлять устанавливать второй/третий манагер пакетов (pip, npm, cargo и так далее). Они будут мешать друг другу, что со временем выльется в непонятные сбои.
Со стороны разработки - вам же не придётся сопровождать питон и его окружение. Не придётся всё это своевременно обновлять, патчить, компилировать и так далее. Пусть каждый занимается своим проектом. Вы - своим, разрабы питона - своим, разрабы дистрибутива - дистрибутивом и так далее.
Я всё сказал.