python C API中新自定义类对象的返回列表
我需要通过pythoncapi创建一个新的列表,其中包含我用C++编写的python C API中新自定义类对象的返回列表,python,pointers,swig,python-c-api,python-c-extension,Python,Pointers,Swig,Python C Api,Python C Extension,我需要通过pythoncapi创建一个新的列表,其中包含我用C++编写的Quaternion类的对象的新副本。[事实上,但任何一种序列都可以。]但我尝试过的每件事都会出现seg故障。我对指针很在行,所以这不是什么大惊喜。我在想,也许我需要让python拥有我用new创建的对象的所有权 到目前为止,我得到的最好结果如下。我不应该在创建四元数时复制它吗?我在做别的蠢事吗?我现在需要告诉python它拥有这个引用吗?返回的名单是否应该存在并像我期望的那样过上幸福的生活 PyObject* Object
Quaternion
类的对象的新副本。[事实上,但任何一种序列都可以。]但我尝试过的每件事都会出现seg故障。我对指针很在行,所以这不是什么大惊喜。我在想,也许我需要让python拥有我用new
创建的对象的所有权
到目前为止,我得到的最好结果如下。我不应该在创建四元数时复制它吗?我在做别的蠢事吗?我现在需要告诉python它拥有这个引用吗?返回的名单是否应该存在并像我期望的那样过上幸福的生活
PyObject* Objectify(std::vector<Quaternion>& v) {
Py_ssize_t size = v.size();
PyArrayObject* list = (PyArrayObject*) PyList_New(size);
for(Py_ssize_t i=0; i<size; ++i) {
PyObject* o = (PyObject*) new Quaternion(v[i]);
PyList_SET_ITEM((PyObject*)list, i, o);
}
return PyArray_Return(list);
}
PyObject*Objectify(std::vector&v){
Py_ssize_t size=v.size();
PyArrayObject*列表=(PyArrayObject*)PyList_新(大小);
对于(Py_ssize_t i=0;i现在我看到了它,这很明显。我不能只是将任意类型强制转换为PyObject
;它实际上需要一些实际的python结构。例如,我认为PyArrayObject
可以这样强制转换,但我的随机类需要包装,正如dastrobu在我的文章中解释的那样
正如我提到的,我使用的是SWIG,它已经将四元数
包装成某种类型的PyObject
(虽然它被赋予了其他名称来表示它是由SWIG制作的)。因此,虽然这并不能回答我的一般问题,但以下内容正是我所需要的(包括创建numpy数组,而不仅仅是列表):
npy_intp size=v.size();
PyArrayObject*npy_arr=重新解释强制转换(PyArray_SimpleNew(1,&size,npy_对象));
PyObject**data=static_cast(PyArray_data(npy_arr));
对于(npy_intp i=0;i
npy_intp size = v.size();
PyArrayObject *npy_arr = reinterpret_cast<PyArrayObject*>(PyArray_SimpleNew(1, &size, NPY_OBJECT));
PyObject** data = static_cast<PyObject**>(PyArray_DATA(npy_arr));
for(npy_intp i=0; i<size; ++i) {
PyObject* qobj = SWIG_NewPointerObj((new Quaternions::Quaternion(v[i])),
SWIGTYPE_p_Quaternions__Quaternion, SWIG_POINTER_OWN);
if(!qobj) {SWIG_fail;}
data[i] = qobj;
Py_INCREF(qobj);
}