如何用SWIG将C++项目的Python绑定拆分为多个子模块?
将SWIG生成的Python绑定拆分为子模块
1. 拆分SWIG接口文件
把原有的单个接口文件拆分为对应子模块的独立接口:
ModuleOne.i:
%module example.ModuleOne %{ // 归属ModuleOne的头文件 #include "header1.hpp" #include "header2.hpp" %} %include "header1.hpp" %include "header2.hpp"
ModuleTwo.i:
%module example.ModuleTwo %{ // 归属ModuleTwo的头文件 #include "header3.hpp" #include "header4.hpp" %} %include "header3.hpp" %include "header4.hpp"
注意:
%module指定层级名称example.ModuleOne,SWIG会自动生成符合Python包结构的绑定文件。
2. 构建Python包目录结构
创建如下目录结构,将生成的绑定文件放入对应位置:
example/ ├── __init__.py # 空文件即可,标识为Python包 ├── _ModuleOne.so # 编译后的C++扩展(Windows下为.pyd) ├── ModuleOne.py # SWIG生成的Python封装文件 ├── _ModuleTwo.so └── ModuleTwo.py
3. 配置构建脚本(setup.py)
更新构建脚本,同时编译两个子模块:
from setuptools import setup, Extension # 定义ModuleOne的扩展 ext_module_one = Extension( 'example._ModuleOne', sources=['ModuleOne.i', 'header1.cpp', 'header2.cpp'], swig_opts=['-c++'] # 针对C++项目的SWIG参数 ) # 定义ModuleTwo的扩展 ext_module_two = Extension( 'example._ModuleTwo', sources=['ModuleTwo.i', 'header3.cpp', 'header4.cpp'], swig_opts=['-c++'] ) setup( name='example', packages=['example'], # 声明包含example包 ext_modules=[ext_module_one, ext_module_two] )
4. 编译与使用
执行编译安装:
pip install .
之后即可按模块化方式导入:
# 导入整个子模块 import example.ModuleOne # 从子模块导入特定类 from example.ModuleTwo import ClassThree
额外注意事项
- 跨模块依赖处理:如果子模块间存在类型依赖,需在接口文件中用
%import引入依赖的SWIG接口(如在ModuleOne.i中添加%import "ModuleTwo.i")。 - 公共配置复用:若有全局类型映射、宏定义等,可抽为
common.i,在各子模块接口中用%include "common.i"引入。
内容的提问来源于stack exchange,提问作者aaries
相关产品推荐
相关产品推荐

