Включить зависимости времени выполнения в колеса Python
Я хотел бы распространять весь virtualenv или набор Python-колёс точных версий с их зависимостями времени выполнения, например:
- pycurl
- pycurl.so
- libcurl.so
- libz.so
- libssl.so
- libcrypto.so
- libgssapi_krb5.so
- libkrb5.so
- libresolv.so
- libkrb5.so
- libcurl.so
- pycurl.so
Я полагаю, что на систему можно установить libssl.so, но, конечно, не libcurl.so правильной версии и, вероятно, не Kerberos.
Какой самый простой способ упаковать одну библиотеку в колесо с учетом всех зависимостей времени выполнения?
Или это дурацкое поручение, и я должен упаковать весь virtualenv? Как это сделать надежно?
PS компиляция на лету не вариант, некоторые модули пропатчены.
2 ответа
AFAIK, хорошего стандартного способа переноса зависимостей с вашим пакетом не существует. Континуум сделал conda именно для этой цели. Парни из numpy написали свой собственный подмодуль distutils в своем пакете, чтобы установить некоторые сложные зависимости, и теперь, по крайней мере, некоторые из них выступают за решение conda. К сожалению, вам может потребоваться сделать пакеты conda для некоторых из этих зависимостей самостоятельно.
Если у вас все в порядке без переносимости, тогда очевидно, что нацеливание на менеджер пакетов целевых машин сработает. В противном случае, для портативного менеджера пакетов, conda - единственный вариант, который я знаю.
В качестве альтернативы, из вашего поста ("компиляция на лету - не вариант") звучит так, что переносимость может не быть проблемой для вас, и в этом случае вы также можете установить все требования в каталог префиксов (большинство установщиков, которые я приехал) через поддержку configure --prefix=/some/dir/
опция). Если у вас гарантированная единая архитектура, вы можете установить все свои зависимости в один каталог с префиксом и передать их как файл. Подход conda, вероятно, будет чище, но я довольно часто использовал префиксные установки, и они, как правило, являются одним из самых простых решений для начала.
Редактировать: Что касается conda, то это одновременно пакетный менеджер и среда / python, похожая на "virtualenv". Хотя virtualenv добавляется поверх существующей установки Python, conda берет на себя всю установку, так что вы можете быть более уверены, что все зависимости учтены. По сравнению с pip он предназначен для добавления обобщенных не-Python-зависимостей, а не просто для компиляции расширений C/Cpp. Для получения дополнительной информации, я бы увидел:
- pip vs conda (также рекомендует buildout как возможность)
- Конда как установка питона
Что касается того, как использовать conda для ваших целей, в документах объясняется, как создать рецепт:
Конда построить каркас
Создание пакета требует рецепта. Рецепт представляет собой плоский каталог, который содержит следующие файлы:
meta.yaml
(файл метаданных)build.sh
(Скрипт сборки Unix, который выполняется с использованием bash)bld.bat
(Скрипт сборки Windows, который выполняется с помощью cmd)run_test.py
(необязательный тестовый файл Python)- патчи к источнику (необязательно, см. ниже)
- другие ресурсы, которые не включены в исходный код и не могут быть созданы сценариями сборки.
Один и тот же рецепт должен использоваться для сборки пакета на всех платформах.
При создании пакета выполняются следующие шаги:
- читать метаданные
- скачать исходник (в кеш)
- извлечь источник в исходном каталоге
- применить патчи
- создать среду сборки (здесь устанавливаются зависимости сборки)
- запустите реальный скрипт сборки. Текущий рабочий каталог - это исходный каталог с установленными переменными среды. Сценарий сборки устанавливается в среду сборки
- выполните некоторые необходимые шаги постобработки: shebang, rpath и т. д.
- добавить метаданные conda в среду сборки
- упаковать новые файлы в среде сборки в пакет conda
- протестируйте новый пакет conda:
- создать тестовую среду с пакетом (и его зависимостями)
- запустить тестовые сценарии
Примеры рецептов для многих пакетов conda в
conda-recipes <https://github.com/continuumio/conda-recipes>
_ репоThe: ref:
conda skeleton <skeleton_ref>
Команда может помочь сделать скелетные рецепты для распространенных репозиториев, таких какPyPI <https://pypi.python.org/pypi>
_.
Затем, как клиент, вы должны установить пакет, аналогичный тому, который вы устанавливаете из pip.
Наконец, докер также может быть вам интересен, хотя я не видел, чтобы он широко использовался для Python.
Вы можете посмотреть в PEX: https://pex.readthedocs.io/en/stable/whatispex.html
"Файлы с расширением.pex -" PEX файлы "или".pex файлы "- являются автономными исполняемыми виртуальными средами Python. PEX-файлы облегчают развертывание приложений Python: процесс развертывания становится просто scp.'