使用C++编写一个Python模块要做 4 件事情:
1. C++类型定义,将这个类型封装为 Python 类对象。2. 定义一个模块,一个模块对应一个C++的类型。3. 实现模块初始化函数,当import 模块时,Python会调用这个初始化函数。4. 构建模块,使用 setup.py 构建模块。
下面我们一 一讲解这 4 件事情:
1. 使用C++封装一个 Python 对象
这一步涉及一些宏函数, 封装Python对象的C++类中需要实现一个静态成员函数static void init_type(void),在这个函数中使用这些宏来注册那些要暴露给Python的成员函数,并且模块初始化中需要调用这个静态函数。
这些宏分为两部分: 注册、实现,先来了解一下:
- 1. 用于注册方法的宏:
|
|
- 2. 用于实现方法的宏
|
|
- 3. 示例
类定义:
|
|
成员函数实现:
|
|
被注册的函数定义时,要符合注册时函数签名要求。
|
|
2. 定义模块
使用Py::ExtensionModule<T>类来定义模块。
|
|
add_varargs_method和add_keyword_method是 Py::ExtensionModule
两种函数在定义时,也要符合注册时的规范:
|
|
3. 模块初始化
现在需要定义一个模块初始化函数,该函数的形式为PyObject *PyInit_xxx(), “xxx”就是模块名称。
当执行 import xxx 时,Python 解释器会加载 xxx 的动态库(如 xxx.so 或 xxx.pyd),并调用 PyInit_xxx 初始化模块。
|
|
4. 构建模块
使用Python的setuptools编写构建脚本,一般命名为setup.py,该脚本文件包含三部分:
- 系统路径配置。
- 配置必要的链接库。
- 模块配置。
|
|