У меня есть библиотека C ++ (в дальнейшем мы будем называть ее примером), для которой я написал привязки Python с использованием библиотеки boost.python. Эта библиотека в Python будет называться pyExample. Весь проект построен с использованием CMake, и получившаяся Python-упакованная библиотека представляет собой файл с именем libpyExample.so
,
Когда я использую привязки Python из скрипта Python, расположенного в том же каталоге, что и libpyExample.so
Я просто должен написать:
import libpyExample
libpyExample.hello_world()
и это выполняет hello_world()
функция, предоставляемая процессом упаковки.
Для удобства я бы хотел, чтобы моя библиотека pyExample была доступна из любого места, просто используя команду
import pyExample
Я также хочу, чтобы pyExample легко устанавливался в любом virtualenv всего за одну команду. Поэтому я подумал, что для этого будет удобнее использовать setuptools. Следовательно, это будет означать:
libpyExample.so
видимый для любого скрипта PythonЯ нашел много вещей о компиляции расширений C ++ с помощью setuptools, но ничего о упаковке предварительно скомпилированных расширений C ++. Возможно ли то, что я хочу сделать?
Я не хочу собирать библиотеку pyExample с помощью setuptools, я бы не хотел слишком сильно изменять существующий проект. Сборка CMake просто отлично, я могу получить libpyExample.so
подать очень легко.
Если я правильно понимаю ваш вопрос, у вас следующая ситуация:
Последний затем позволяет позвонить python setup.py install --user
, который устанавливает lib в site-packages
каталог и делает его доступным из любого пути в вашей системе.
То, что вы хотите, возможно, если вы перегружаете классы, которые использует setuptools для сборки расширений, так что эти классы фактически вызывают вашу систему сборки CMake. Это не тривиально, но вы можете найти рабочий пример здесь, предоставленный проектом pybind11:
https://github.com/pybind/cmake_example
Заглянуть в setup.py
, вы увидите, как классы build_ext
а также Extension
наследуются и модифицируются для выполнения сборки CMake.
Это должно работать из коробки для вас или с небольшими изменениями — если ваша сборка требует специального -D
флаги, которые будут установлены.
Надеюсь, это поможет!
Других решений пока нет …