使用SWIG将C++文件包装为Python 2模块的技术求助
嘿,作为刚摸SWIG的编程新手,我太懂你想把C++类包装成Python2模块的需求了!咱们一步步来,把你的multiplyChannel.h搞定,让你能轻松import multiplyChannel然后用multiplyChannel.function(inputs)调用函数~
第一步:写SWIG接口文件(.i)
首先得整个SWIG接口文件,就叫multiplyChannel.i吧,内容大概这样:
%module multiplyChannel %{ // 这里放要SWIG处理的头文件,直接引你的multiplyChannel.h就行 #include "multiplyChannel.h" %} // 告诉SWIG要包装头文件里的所有内容,直接include就行 %include "multiplyChannel.h" // 划重点!你的头文件用了std::vector和std::complex,得让SWIG识别这些类型,加上这两行 %include <std_vector.i> %include <std_complex.i>
第二步:用SWIG生成包装代码
打开终端敲这个命令,生成Python和C++的包装文件:
swig -c++ -python multiplyChannel.i
跑完会出来俩文件:multiplyChannel_wrap.cxx(C++包装代码)和multiplyChannel.py(Python模块文件),这俩是关键!
第三步:编译成Python能导入的扩展模块
接下来要把这些代码编译成Python认的.so(Linux/macOS)或者.pyd(Windows)文件。咱们写个setup.py文件用distutils来编译:
from distutils.core import setup, Extension # 定义扩展模块,记得把你的C++实现文件(比如multiplyChannel.cpp)加进去! multiplyChannel_module = Extension('_multiplyChannel', sources=['multiplyChannel_wrap.cxx', 'multiplyChannel.cpp'], ) setup(name='multiplyChannel', version='0.1', author="你自己的名字", description="把C++的multiplyChannel包装给Python2用", ext_modules=[multiplyChannel_module], py_modules=["multiplyChannel"], )
然后在终端运行编译命令:
python setup.py build_ext --inplace
编译成功后,当前目录会出现_multiplyChannel.so(或者Windows下的.pyd)和multiplyChannel.py,这时候就可以导入用啦!
第四步:测试你的模块
打开Python2终端,试试导入和调用:
import multiplyChannel # 假设你的C++里有个multiply函数,参数是std::vector<std::complex<double>> input_data = [1+2j, 3+4j] result = multiplyChannel.multiply(input_data) print(result)
新手容易踩的坑提醒
- 别忘把你的C++实现文件(比如
multiplyChannel.cpp)和头文件放在同一目录,不然编译会找不到文件 - Python2和SWIG版本要搭,SWIG 3.x对Python2支持最好,别用太新的SWIG(比如4.x对Python2支持有限)
- 如果头文件里有
using namespace std;,SWIG一般能自动处理,但还是要加上之前的std库接口文件,不然类型转换会出问题 - 要是编译时出现类型错误,大概率是类型映射没弄好,比如std::vector转Python列表,SWIG的标准库已经帮咱们做了,只要加对
%include就行
内容的提问来源于stack exchange,提问作者Kyle McClintick
相关产品推荐
相关产品推荐

