Как включить внешнюю библиотеку с пакетом python wheel

Я хочу создать пакет для python, который внедряет и использует внешнюю библиотеку (.so) в Linux с помощью модуля cffi.

Есть ли стандартный способ включить .so файл в пакет python?

Пакет будет использоваться только внутренне и не будет опубликован в pypi.

Я думаю, что Колесные пакеты - лучший вариант - они создавали бы платформу определенного пакета со всеми файлами, готовыми к копированию, поэтому нет необходимости создавать что-либо в целевых средах.

Ответы

Ответ 1

Вы можете использовать auditwheel, чтобы вставлять внешние библиотеки в колесо:

repairwheel repair: копирует эти внешние разделяемые библиотеки в само колесо и автоматически изменяет соответствующие записи RPATH таким образом, что эти библиотеки будут отобраны во время выполнения. Это приводит к аналогичному результату, как если бы библиотеки были статически связаны без необходимости внесения изменений в систему сборки. Упаковщикам рекомендуется, чтобы связывание, подобно статической привязке, могло затрагивать проблемы, связанные с авторским правом.

Вы можете предварительно создать внешнюю библиотеку С++, выполнив следующее:

./configure && make && make install

Это создаст файл my_external_library.so и установит его по соответствующему пути. Тем не менее, вам нужно убедиться, что путь библиотеки правильно настроен, чтобы проверочный стол обнаружил недостающую зависимость.

export LD_LIBRARY_PATH=/usr/loca/lib

Затем вы можете создать колесо python, выполнив:

python setup.py bdist_wheel

Наконец, вы можете отремонтировать колесо, которое будет вставлять my_external_library.so в пакет.

auditwheel repair my-python-wheel-1.5.2-cp35-cp35m-linux_x86_64.whl

Я успешно применил вышеуказанные шаги к библиотеке python confluent-kafka-python, которая имеет требуемую зависимость c/С++ от librdkafka.

Ответ 2

Колеса - стандартный способ распространения пакетов Python, но есть проблема, когда у вас есть модули расширения, которые зависят от других so. Это связано с тем, что используется обычный динамический компоновщик Linux, и он выглядит только в /usr/lib или /usr/local/lib. Это проблема при установке колеса в virtualenv.

Насколько я знаю, у вас есть три варианта:

  • Статическая привязка, поэтому "обертка" не зависит ни от чего,
  • с помощью ctypes, чтобы обернуть so непосредственно из Python;
  • Разделите дистрибутив на колесо с кодом и оболочкой Python и отдельный RPM или DEB, чтобы установить его так, чтобы в /usr/lib или /usr/local/lib.

Колесо может работать, если вы включите зависимый so в качестве файла данных, который будет храниться в /lib, и установите в корневую среду Python (не пробовал это), но это сломается, если кто-то попытается установить колесо в virtualenv (попробовали это).