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_;
};
假设我有一个 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_;
};