Создание модуля C ++ частью пакета Python

У меня есть следующий макет каталога

awesome_package
\- module1.py
\- build
\- module2.so

В настоящее время я импортирую module1 как

import awesome_package.module1

и module2 как

import sys
sys.path.append('path/to/awesome_package/build')
import module2

но я бы хотел использовать прежний синтаксис.

module2 создан pybind11 таким образом, как:

PYBIND11_MODULE(module2, module2) {
module2.doc() = "C++ module wrapped for Python";
module2.def("some_cpp_function", some_cpp_function)
}

11

Решение

Как я уже сказал в своем комментарии, двоичные модули Python обычно создаются с distutils/setuptools, Для этого вам нужно написать setup.py скрипт со всеми необходимыми опциями. Ниже приведен очень минимальный пример, показывающий только основные вещи:

from setuptools import setup, Extension

setup(
name = 'awesome',
version = '0.0.1',
packages = ['awesome_package']
ext_modules = [Extension(
'awesome_package.module2',
['src/module2.cpp']
)]
)

Естественно, в setup.py вам нужно указать все параметры сборки, такие как заголовочные файлы, флаги компилятора и т. д.

Если вы настаиваете на использовании CMake, вам нужно добавить собственную команду копирования, чтобы скопировать ваш скомпилированный модуль в ваш пакет. Что-то вроде этого:

add_custom_command(TARGET module2 POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:module2>
"${CMAKE_SOURCE_DIR}/awesome_package")
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]