使用numpy.i和swig

时间:2015-05-12 21:58:47

标签: python c numpy swig

c结构中的以下内容已经用swig包装,以便我可以在python中访问从另一个swig包装程序获取的数据。

struct RadarParm {
  struct {
    char major;
    char minor;
  } revision;

  struct {
   char code;
   char *time;
   char *command;
  } origin;

  int16 cp;
  int16 stid;
  int16 *pulse;
  int16 *lag[2]; 
  char *combf;
};

我的主要问题是int16 * lag [2]。当我尝试用我的python代码读取数据时:

p_data['lag'] = prm.lag

其中prm是从rtserver.c文件返回的类型,通过方法struct RadarParm * getRadarParm()和p_data是一个存储RadarParm的每个部分的python字典。

这是我访问prm.lag时的当前输出:

<Swig Object of type 'int16 **' at 0x1fd55d0>

我发现似乎有一个处理数组和int16数据类型的numpy.i文件。根据我的有限理解,我认为这将允许我访问这些数据。如果我能正确实现它。

这是我到目前为止所做的:

%init %{
    import_array();
%}

%apply (int16** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) {(int16* lag,2)};

编译时我得到:

Error: Syntax error in input(1).

关于如何使这项工作的任何想法?

1 个答案:

答案 0 :(得分:0)

在这种情况下,numpy.i无效。主要问题是numpy.i不支持(out)类型图,在这种情况下,这正是我所需要的。

在编译swig rtserver.i文件时使用命令-debug-tmsearch。使用命令的输出我能够确定RadarParm :: lag的定义swig类型及其应该是什么。这是有效的代码。

%typemap(out) int16*[2] {
  int i;
  $result = PyList_New(2);
  for (i = 0; i < 2; i++) {
    PyObject *o = PyInt_FromLong($1[i]);
    PyList_SetItem($result,i,o);
  }
}
%apply int16*{lag[2]};

大部分内容取自this answer