[英]Return vector<pair<int,int>> & from c++ method to python list of tuples using swig typemap
[英]Typemap resources and converting a list to vector (and back)
我正在使用 SWIG 將 c++ 包裝在 python 中,並且需要使用類型映射以使我的 python 腳本盡可能簡單。 作為第一次嘗試,我只是發送 2 個列表,將它們轉換為向量,添加兩個向量,然后將結果返回到一個新列表中。
我的問題是,我一直發現 SWIG 手冊不是很有指導性,難以理解,也沒有給出任何可靠、完整的示例來說明如何編寫自己的類型圖。
我的問題是:
這是我的代碼:
add_array.h
#include <vector>
#include <functional>
std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2);
add_array.i
%module add_array
%{
#include "add_array.h"
%}
%include std_vector.i
%template(vectorInt) std::vector<int>;
%include "add_array.h"
add_array.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)
這是一個元組(我希望它是一個列表)。 看起來我很幸運,它可以將輸入列表轉換為向量(而另一個方向則沒有那么幸運),但我真的很想知道這是如何發生的,以及如果需要的話,我如何為未來的代碼更改它.
謝謝!
我不知道是否有特定原因,但包含的std_vector.i
將 output 向量轉換為元組而不是列表。 如果你想要一個列表,你需要編寫一個自定義類型映射。
示例(無錯誤檢查):
%module add_array
%{
#include "add_array.h"
%}
%include <std_vector.i>
%template(vectorInt) std::vector<int>;
// Override the template output typemap with one that returns a list.
%typemap(out) std::vector<int> (PyObject* tmp) %{
tmp = PyList_New($1.size());
for(int i = 0; i < $1.size(); ++i)
PyList_SET_ITEM(tmp,i,PyLong_FromLong($1[i]));
$result = SWIG_Python_AppendOutput($result,tmp);
%}
%include "add_array.h"
Output:
>>> import add_array
>>> add_array.add_array([1,2,3],[4,5,6])
[5, 7, 9]
就教程而言,我只閱讀過 SWIG 文檔和 C 語言擴展的語言特定文檔。 它實際上是相當不錯的文檔,但你不能只是挑選和選擇要閱讀的內容。 研究前十幾個部分的基礎知識,然后跳到特定於語言的部分(例如 Python)。 SWIG 安裝下也有一個示例目錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.