使用pybind11将c ++函数添加到现有的python模块

时间:2017-08-09 21:25:48

标签: python setuptools pybind11

如何使用pybind11创建python子模块?

我克隆了python示例(https://github.com/pybind/python_example)并对其进行了修改。下面是目录树。

*
|
+-- src
|   |
|   +-- example.cpp 
|
+-- setup.py
|
+-- python_example
     |
     +-- __init__.py
     |
     +-- cxx
         |
         +-- __init__.py

setup.py包含以下行:

ext_modules = [
    Extension(
        'python_example.cxx',
        ['src/main.cpp'],
        include_dirs=[
            # Path to pybind11 headers
            get_pybind_include(),
            get_pybind_include(user=True),
            "include",  # the include folder
        ],
        language='c++'
    ),
]



setup(
    ...
    packages=setuptools.find_packages(),
    ...
)

以下操作无效,因为它无法使用点名称。

PYBIND11_PLUGIN(python_example.cxx) {
    ...
}

以下也不起作用。

PYBIND11_PLUGIN(python_example) {
    py::module m = py::module::import("python_example.cxx");

    m.def("add", &add, R"pbdoc(
        Add two numbers

        Some other explanation about the add function.
    )pbdoc");
}

这也不起作用:

py::module m2 = (py::module) py::module::import("python_example").attr("cxx");

m2.def("add", &add, R"pbdoc(...

如何使这项工作?

1 个答案:

答案 0 :(得分:1)

cxx是一个子包,您尝试构建具有相同名称的二进制模块。尝试以不同方式命名二进制模块以避免名称冲突。

setup.py

ext_modules = [
    Extension(
        'python_example.cxx.cxx_module',
...

main.cpp

PYBIND11_PLUGIN(cxx_module) {
    ...
}