簡體   English   中英

Python / SWIG:輸出一個數組

[英]Python/SWIG: Output an array

我試圖從使用SWIG for Python包裝的C函數輸出一個值數組。 我嘗試的方法是使用以下typemap。

偽代碼:

int oldmain() {
float *output = {0,1};
return output;
}

類型表:

%typemap(out) float* { 
   int i; 
  $result = PyList_New($1_dim0); 
   for (i = 0; i < $1_dim0; i++) { 
 PyObject *o = PyFloat_FromDouble((double) $1[i]); 
 PyList_SetItem($result,i,o); 
 } 
} 

我的代碼編譯得很好,但是當我運行訪問這個函數時它會掛起(沒有更多的方法來調試它)。

關於我哪里出錯的任何建議?

謝謝。

允許長度變化的最簡單方法是添加另一個輸出參數,該參數也可以告訴您數組的大小:

%module test

%include <stdint.i>

%typemap(in,numinputs=0,noblock=1) size_t *len  {
  size_t templen;
  $1 = &templen;
}

%typemap(out) float* oldmain {
  int i;
  $result = PyList_New(templen);
  for (i = 0; i < templen; i++) {
    PyObject *o = PyFloat_FromDouble((double)$1[i]);
    PyList_SetItem($result,i,o);
  }
}

%inline %{
float *oldmain(size_t *len) {
  static float output[] = {0.f, 1.f, 2, 3, 4};
  *len = sizeof output/sizeof *output;
  return output;
}
%}

這是從這個答案修改為添加size_t *len ,可用於在運行時返回數組的長度。 類型映射完全隱藏了Python包裝器的輸出,而是在%typemap(out)使用它而不是固定大小來控制返回列表的長度。

這應該讓你去:

/* example.c */

float * oldmain() {
    static float output[] = {0.,1.};
    return output;
}

你在這里返回一個指針,swig不知道它的大小。 普通的$ 1_dim0不起作用,所以你必須硬編碼或做其他魔術。 像這樣的東西:

/* example.i */
%module example
%{
 /* Put header files here or function declarations like below */
  extern float * oldmain();
%}

%typemap(out) float* oldmain {
  int i;
  //$1, $1_dim0, $1_dim1
  $result = PyList_New(2);
  for (i = 0; i < 2; i++) {
    PyObject *o = PyFloat_FromDouble((double) $1[i]);
    PyList_SetItem($result,i,o);
  }
}

%include "example.c"

然后在python中你應該得到:

>> import example
>> example.oldmain()
[0.0, 1.0]

添加類型映射時,您可能會發現-debug-tmsearch非常方便,即

swig -python -debug-tmsearch example.i

應該清楚地指出在為float *oldmain尋找合適的'out' float *oldmain時使用了你的typemap。 此外,如果您只想訪問c全局變量數組,您可以使用varout typemap而不是out來執行相同的操作。

暫無
暫無

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

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