Включить зависимости времени выполнения в колеса Python

Я хотел бы распространять весь virtualenv или набор Python-колёс точных версий с их зависимостями времени выполнения, например:

  • pycurl
    • pycurl.so
      • libcurl.so
        • libz.so
        • libssl.so
        • libcrypto.so
        • libgssapi_krb5.so
          • libkrb5.so
            • libresolv.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. Для получения дополнительной информации, я бы увидел:

Что касается того, как использовать conda для ваших целей, в документах объясняется, как создать рецепт:

Конда построить каркас

Создание пакета требует рецепта. Рецепт представляет собой плоский каталог, который содержит следующие файлы:

  • meta.yaml (файл метаданных)
  • build.sh (Скрипт сборки Unix, который выполняется с использованием bash)
  • bld.bat (Скрипт сборки Windows, который выполняется с помощью cmd)
  • run_test.py (необязательный тестовый файл Python)
  • патчи к источнику (необязательно, см. ниже)
  • другие ресурсы, которые не включены в исходный код и не могут быть созданы сценариями сборки.

Один и тот же рецепт должен использоваться для сборки пакета на всех платформах.

При создании пакета выполняются следующие шаги:

  1. читать метаданные
  2. скачать исходник (в кеш)
  3. извлечь источник в исходном каталоге
  4. применить патчи
  5. создать среду сборки (здесь устанавливаются зависимости сборки)
  6. запустите реальный скрипт сборки. Текущий рабочий каталог - это исходный каталог с установленными переменными среды. Сценарий сборки устанавливается в среду сборки
  7. выполните некоторые необходимые шаги постобработки: shebang, rpath и т. д.
  8. добавить метаданные conda в среду сборки
  9. упаковать новые файлы в среде сборки в пакет conda
  10. протестируйте новый пакет 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.'

Другие вопросы по тегам