Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python C API中新自定义类对象的返回列表_Python_Pointers_Swig_Python C Api_Python C Extension - Fatal编程技术网

python C API中新自定义类对象的返回列表

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

我需要通过pythoncapi创建一个新的列表,其中包含我用C++编写的
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);
}