Как включить внешнюю библиотеку с пакетом 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 (попробовали это).