簡體   English   中英

從 swig 返回 double * 作為 python 列表

[英]return double * from swig as python list

我有一個 C++ 類,其中一個方法返回一個double *數組,這是它的成員變量之一。 我正在嘗試將其作為 Python 中的列表進行訪問。 我將它包裝在一個doubleArray_frompointer ,然后嘗試使用 deepcopy 將它安全地從那里取出,但是當doubleArray超出范圍時我仍然遇到問題,它的內存被清理,然后 C++ 類嘗試清理相同的內存(盡管我創建的要點中沒有顯示)。

我懷疑我應該用類型圖來做這件事。

我試圖包裝的是:

double *foo() {
  double *toReturn = new double[2];
  toReturn[0] = 2;
  toReturn[1] = 4;
  return toReturn;
}

界面是:

%module returnList
%include "returnList.h"

%include "cpointer.i"
%pointer_functions(double, doubleP)

%include "carrays.i"
%array_class(double, doubleArray);

%{
#include "returnList.h"
%}

您說類型映射可用於避免在 Python 端編寫循環是正確的。 我整理了一個例子 - 它與另一個答案非常相似。

%module test

%typemap(out) double *foo %{
  $result = PyList_New(2); // use however you know the size here
  for (int i = 0; i < 2; ++i) {
    PyList_SetItem($result, i, PyFloat_FromDouble($1[i]));
  }
  delete $1; // Important to avoid a leak since you called new
%}

%inline %{
double *foo() {
  double *toReturn = new double[2];
  toReturn[0] = 2;
  toReturn[1] = 4;
  return toReturn;
}
%}

此處的類型映射匹配名為foo返回double *的函數 - 您可以更廣泛地匹配,但是對於返回double *並不意味着您返回大小為 2 的數組的函數,可能會有做錯事的風險。

使用此類型映射,我可以運行:

Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.foo()
[2.0, 4.0]
>>>

您需要像這樣手動編寫它的原因是因為 SWIG 無法推斷您從foo返回的數組的長度。 它甚至可能因調用而異。

我“解決”了這個問題,不是通過返回任何類型的向量或類似數組的對象,而是通過在 Python 中重新創建最初生成數組的(簡單)循環。 也就是說,我的 C++ 代碼只需要返回單個雙精度值,而我的 Python 代碼將組合該列表。

更明確地說,我有 C++ 方法double *simulation.run() ,這引起了麻煩。 我創建了一個新的 C++ 方法double simulation.doRound() ,然后在numRounds迭代的 Python 循環中通過 SWIG 調用它, numRounds迭代都執行numRounds outputs.append(simulation.doRound())

但是,我仍然想知道如何通過 SWIG 將 C/C++ double *數組復制到 Python 列表,因為這似乎是一個基本操作。 如果有人可以回答這個問題,我會標記為已接受的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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