1

如何使用 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(...

如何使这项工作?

4

1 回答 1

1

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

setup.py

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

main.cpp

PYBIND11_PLUGIN(cxx_module) {
    ...
}
于 2017-08-17T21:15:25.000 回答