SWIG将PyObject作为python对象返回?

时间:2015-02-10 06:30:01

标签: python numpy swig

假设我有一个SWIG包装类来处理指向某些数据的指针,如下面的代码所示。我想从数据构造一个numpy ndarray对象并将其返回给用户。我希望它使用数据作为缓冲区但不取得所有权。如果我是对的,我将使用numpy C ++ api PyArray_SimpleNewFromData。但是,我的问题是如何将其返回到python?如果我编写以下get函数,SWIG会自动将其作为python对象返回吗?如果没有,我该怎么办?

class Test {
 public:
  Test () { ptr_ = new uint8_t[200]; }
  ~Test() { delete [] ptr_; }

  PyObject* get() {
    npy_intp dims[1] = {25};
    return PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, ptr_);
  }

 private:
  uint8_t* ptr_;
};

顺便说一句,我也在努力寻找上述api的头文件和库文件。如果你知道的话也请告诉我。感谢。

更新:

我试过SWIG包装这个类。其他一切都很好,除非我在python中调用get函数(如下所示),我得到了分段错误。任何帮助表示赞赏。

x = Test()
y = x.get()

更新2:

似乎PyArray_SimpleNewFromData是一个已弃用的函数。那么这仍然是支持还是还有其他更推荐的方法吗?

1 个答案:

答案 0 :(得分:0)

我在swig中找到了使用typemap的解决方案:

%typemap(out) double* {
  npy_intp dims[1] = {25};
  $result = PyArray_SimpleNewFromData(1, dims, PyArray_DOUBLE, $1);
}

class Test {
 public:
  Test () { ptr_ = new uint8_t[200]; }
  ~Test() { delete [] ptr_; }

  double* get() {
    return (double*) ptr_;
  }

 private:
  uint8_t* ptr_;
};