You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:01:39