Как импортировать или установить готовый модуль расширения Python (C++) (т.е. библиотеку, не скомпилированную с помощью setuptools)?

У меня есть проект C++, для которого я разрабатываю интерфейс Python. На данный момент я использую pybind11, так как он выглядит довольно аккуратно и имеет несколько хороших инструментов для создания модуля расширения. с CMake, так создается основной проект C++.

Через CMake мне удалось получить общую библиотеку, содержащую функции интерфейса для сборки, однако теперь, когда она у меня есть, я не знаю, как сообщить Python, что она существует, и сделать ее импортируемой. Я не хочу перенастраивать всю сборку проекта для запуска через Python (т.е. как описано здесь с setuptools), потому что это большой проект, и я просто предоставляю интерфейс Python для его части. Поэтому было бы предпочтительнее, если бы я мог просто собрать общую библиотеку для Python вместе с остальной частью кода C++, а затем чуть позже запустить «setup.py install», чтобы сделать все, что нужно сделать, чтобы сделать общую библиотеку видимой. к Питону.

Это возможно? Или мне нужно выполнить какой-то другой рефакторинг, например, заставить основной проект создавать некоторые другие чистые библиотеки C++, которые затем я просто связываю с библиотекой модуля расширения Python, которая создается отдельно с помощью инструментов настройки?


person Ben Farmer    schedule 21.11.2017    source источник
comment
Является ли этот двоичный модуль автономным или частью какого-либо пакета Python, который также включает чистые модули Python?   -  person Roman Miroshnychenko    schedule 22.11.2017
comment
Он автономный, ну, по крайней мере, на данный момент. Предположим, что да :). Я добился некоторого прогресса в своем варианте рефакторинга, который, как я полагаю, более гибкий, но я все же хотел бы знать, возможен ли первый метод.   -  person Ben Farmer    schedule 22.11.2017


Ответы (1)


Если вам нужно установить только один двоичный модуль, вы можете создать простой установщик только для этого модуля. Предположим, что у вас есть двоичный модуль foo.so (или foo.pyd, если вы работаете в Windows), который уже собран с помощью сценария сборки, сгенерированного cmake. Затем вы можете создать простой сценарий установки:

from setuptools import setup

setup(
    name='foo',
    version='0.1.2.3',
    py_modules=['foo']
)

Затем вам нужно добавить файл MANIFEST.in, чтобы выбрать файл двоичного модуля:

include foo.so

Итак, вам нужно 3 файла:

foo.so
MANIFEST.in
setup.py

Теперь вы можете сделать python setup.py install из вашей виртуальной среды Python, и ваш бинарный модуль будет установлен в ней. Если вы хотите распространять свой модуль, то лучше установить пакет Python wheel и создать файл .whl: python setup.py bdist_wheel. Такое «колесо» можно потом установить командой pip. Обратите внимание, что бинарные модули должны быть установлены на той же платформе и версии Python, которые использовались для создания этих модулей.

person Roman Miroshnychenko    schedule 22.11.2017