C++编写的Python扩展模块,用于计算两个数的加法

首先,我们需要一个头文件来定义模块的接口,命名为 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