我正在使用 SWIG 将 c++ 包装在 python 中,并且需要使用类型映射以使我的 python 脚本尽可能简单。作为第一次尝试,我只是发送 2 个列表,将它们转换为向量,将两个向量相加,然后将结果返回到新列表中。
我的问题是,我发现 SWIG 手册没有太多指导意义,很难理解,并且没有给出任何可靠、完整的示例来说明如何编写自己的类型映射。
我的问题是:
- 我将如何确保我的列表正确转换为向量,然后再转换回来?
- 对于如何编写类型映射以及所有语法/函数的含义,是否有更好的教程/参考?
这是我的代码:
添加数组.h
#include <vector>
#include <functional>
std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2);
添加数组.i
%module add_array
%{
#include "add_array.h"
%}
%include std_vector.i
%template(vectorInt) std::vector<int>;
%include "add_array.h"
添加数组.cpp
#include "add_array.h"
#include <cassert>
#include <cstring>
std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2) {
assert(src1.size() == src2.size());
std::vector<int> dst;
dst.resize(src1.size());
for (size_t i = 0; i < src1.size(); i++) {
dst[i] = src1[i] + src2[i];
}
return dst;
}
Makefile
all:
rm -f *.so *.o *_wrap.* *.pyc *.gch add_array.py
swig -c++ -python add_array.i
g++ -fpic -c add_array_wrap.cxx add_array.h add_array.cpp -I/home/tools/anaconda3/pkgs/python-3.7.3-h0371630_0/include/python3.7m/
g++ -shared add_array_wrap.o add_array.o -o _add_array.so
array.py (这是我正在运行的文件)
import add_array
a = [1, 2, 3, 4, 5, 6]
b = [5, 6, 7, 8, 9, 10]
c = add_array.add_array(a, b)
print(c)
Output:(6、8、10、12、14、16)
这是作为一个元组出现的(我希望它是一个列表)。
看起来我很幸运它可以将输入列表转换为向量(而在另一个方向则不太幸运),但我真的很想知道这是如何发生的以及如果需要的话如何为未来的代码更改它。
Thanks!