У меня есть следующий макет каталога
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)
}
Как я уже сказал в своем комментарии, двоичные модули 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")
Других решений пока нет …