【发布时间】:2013-10-23 03:51:36
【问题描述】:
我需要通过 python C API 创建一个新列表,其中包含我编写的 Quaternion 类的对象的新副本(在 C++ 中)。 [实际上,I'd really like a numpy array,但任何形式的序列都可以。]但是我尝试过的所有事情都出现了段错误。我的指针很糟糕,所以这并不是一个大惊喜。我在想也许我需要给我用new创建的对象的python所有权。
到目前为止,我得到的最好成绩如下所示。我不应该在newing 时复制构造四元数吗?我在做其他愚蠢的事情吗?我现在需要告诉 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);
}
我可以验证列表在返回之前是否仍然包含正确的元素。也就是说,在上面的循环之后,我创建一个新循环并在列表值旁边打印出原始值,它们匹配。该函数将返回,我可以继续使用 python。但是一旦在循环之外使用列表,就会发生段错误。
[实际上,这一切都是在 SWIG 中完成的,并且此代码位于变量名称略有不同的类型映射中,但我可以查看 _wrap.cxx 文件,发现这正是我编写的方式.]
【问题讨论】:
标签: python pointers swig python-c-api python-c-extension