首先,我们需要一个头文件来定义模块的接口,命名为 addition.h
,内容如下:
#ifndef ADDITION_H
#define ADDITION_H
int add(int x, int y);
#endif
然后,我们编写实现加法计算的源文件 addition.cpp
,内容如下:
#include "Python.h"
#include "addition.h"
static PyObject* add_wrapper(PyObject* self, PyObject* args) {
int x, y, result;
if (!PyArg_ParseTuple(args, "ii", &x, &y)) {
return NULL;
}
result = add(x, y);
return Py_BuildValue("i", result);
}
int add(int x, int y) {
return x + y;
}
static PyMethodDef addition_methods[] = {
{"add", add_wrapper, METH_VARARGS, "Add two numbers"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef addition_module = {
PyModuleDef_HEAD_INIT,
"addition",
"Addition module",
-1,
addition_methods
};
PyMODINIT_FUNC PyInit_addition(void) {
return PyModule_Create(&addition_module);
}
代码解释:
add_wrapper
是一个 Python 可调用函数的包装器,用于将 Python 对象转换为 C++ 对象,然后调用 C++ 的add
函数计算加法并返回结果。add
是实际执行加法计算的函数。addition_methods
是将 C++ 函数暴露给 Python 的结构体。addition_module
是模块的定义,包括模块名称、文档字符串和函数列表。PyInit_addition
是模块的初始化函数,它创建并返回模块对象。
最后,我们可以将源文件编译成共享库,命名为 addition.so
,命令如下:
g++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` addition.cpp -o addition.so
编译完成后,我们就可以在 Python 中导入该模块,并使用 add
函数计算两个数的和了:
import addition
print(addition.add(1, 2)) # 输出:3