簡體   English   中英

類型映射資源並將列表轉換為矢量(和返回)

[英]Typemap resources and converting a list to vector (and back)

我正在使用 SWIG 將 c++ 包裝在 python 中,並且需要使用類型映射以使我的 python 腳本盡可能簡單。 作為第一次嘗試,我只是發送 2 個列表,將它們轉換為向量,添加兩個向量,然后將結果返回到一個新列表中。

我的問題是,我一直發現 SWIG 手冊不是很有指導性,難以理解,也沒有給出任何可靠、完整的示例來說明如何編寫自己的類型圖。

我的問題是:

  1. 我將如何確保我的列表正確轉換為向量,然后再返回?
  2. 關於如何編寫類型映射以及所有語法/函數的含義,是否有更好的教程/參考資料?

這是我的代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM