用Python调用C模块容易发生的就是参数类型不一致的问题,比如,C函数接收传入指针,python端怎么办?这里使用swig作为一种备选方案,处理方式不一定明智简洁,旨在说明可行性。
- 方案一:自我定义空间分配,释放,访问,修改等函数,用swig封装
- 方案二:使用swig内置carrays.i,这里用FFT举个栗子
使用方法,直接在.i文件中声明carrays.i
1 | # fft.i |
其中array_functions(type, name)
会创建一下四个函数
1 | type *new_name(int nelements) # 申请内存 |
定义setup.py
如下,也可以手动编译动态库
1 | #!/usr/bin/env python |
执行(--inplace
使得生成的动态库在当前目录下)
1 | swig -python -c++ fft.i |
编写测试文件
1 | import fft |
测试结果
[ 1.000000 -0.000000]
[ 1.000000 -0.000000]
[ 1.000000 0.000000]
[ 1.000000 -0.000000]
[ 0.000000 0.000000]
[ -0.000000 0.000000]
[ 0.000000 0.000000]
[ -0.000000 0.000000]
...
附FFT源码实现
1 | // FFT.h |
1 |
|