Включение зависимостей во время выполнения на колесах 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? Как сделать это надежно?

P.S. компиляция "на лету" не является вариантом, некоторые модули исправлены.

Ответ 1

AFAIK, нет стандартного стандартного способа установки зависимостей с вашим пакетом. Континуум сделана конда именно для этой цели. Ребята из numpy написали свой собственный подмодуль distutils в своем пакете, чтобы установить некоторые сложные зависимости, а теперь по крайней мере некоторые из они выступают за конду как решение. К сожалению, вам может потребоваться сделать пакеты conda для некоторых из этих зависимостей самостоятельно.

Если вы в порядке, без переносимости, то, очевидно, будет работать таргетинг на диспетчер пакетов целевых компьютеров. В противном случае, для портативного менеджера пакетов, conda - единственный вариант, о котором я знаю.

Альтернативно, с вашего поста ( "компиляция на лету не является вариантом" ), похоже, что переносимость может не быть проблемой для вас, и в этом случае вы также можете установить все требования к префиксный каталог (большинство инсталляторов, с которыми я столкнулся, поддерживают опцию configure --prefix=/some/dir/). Если у вас есть гарантированная единая архитектура, вы можете, вероятно, префикс-установить все свои зависимости в один каталог и передать это как файл. Конда подход, вероятно, будет более чистым, но я использовал префиксные установки совсем немного, и они, как правило, являются одним из самых простых решений для перехода.

Изменить: Что касается conda, то это одновременно пакет-менеджер и "virtualenv" -подобная среда /python install. Хотя virtualenv добавляется поверх существующей установки python, conda берет на себя всю установку, поэтому вы можете быть более уверены в том, что учитываются все зависимости. По сравнению с pip, он предназначен для добавления обобщенных зависимостей, отличных от Python, вместо простого компиляции исключений C/Cpp. Для получения дополнительной информации я бы увидел:

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

Конструкция сборки Conda

Построение пакета требует рецепта. Рецепт - это плоский каталог, который содержит следующие файлы:

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

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

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

  • прочитать метаданные
  • загрузить исходный код (в кеш)
  • извлечь исходный код в исходный каталог
  • применить патчи
  • создать среду сборки (здесь устанавливаются зависимости сборки)
  • запустите фактическую сборку script. Текущий рабочий каталог является источником каталог с установленными переменными среды. Конструкция script устанавливается в среда сборки
  • выполните следующие шаги последующей обработки: shebang, rpath и т.д.
  • добавить метаданные conda в среду сборки
  • упаковать новые файлы в среду сборки в пакет conda
  • проверить новый пакет conda:
    • создать тестовую среду с пакетом (и его зависимостями)
    • запустить тестовые скрипты

Есть примеры рецептов для многих пакетов conda в conda-recipes <https://github.com/continuumio/conda-recipes> _ repo.

Команда: ref: conda skeleton <skeleton_ref> может помочь сделать рецепты скелета для обычных репозитории, такие как PyPI <https://pypi.python.org/pypi> _.

Затем, в качестве клиента, вы установите пакет похожий на то, как вы будете устанавливать из pip

Наконец, docker также может быть вам интересен, хотя я не видел его много используемого для Python.

Ответ 2

Вы можете посмотреть в PEX: https://pex.readthedocs.io/en/stable/whatispex.html

'Файлы с расширением .pex - "Файлы PEX" или ".pex файлы" - это автономные исполняемые виртуальные среды Python. Файлы PEX упрощают развертывание приложений Python: процесс развертывания становится просто scp. '