Создание части модуля С++ пакета 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) 
}

Ответ 1

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

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"
    )