SWIG return PyObject 作为 python 对象?

SWIG return PyObject as python object?

假设我有一个 SWIG 包装的 class 负责处理指向某些数据的指针,如以下代码所示。我想从数据中构造一个 numpy ndarray 对象并将其 return 提供给用户。我希望它使用数据作为缓冲区但不取得所有权。如果我是对的,我将使用 numpy C++ api PyArray_SimpleNewFromData。但是,我的问题是如何将此 return 转换为 python?如果我编写以下 get 函数,SWIG 会自动 return 它作为 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 包装这个 class。其他一切都很好,除了当我在 python 中调用 get 函数(如下所示)时,出现分段错误。感谢任何帮助。

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

更新 2:

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

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

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

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

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

 private:
  uint8_t* ptr_;
};