我目前正在开发C和Python之间的接口,发现了一个无法解决的问题:我想将结构传递给Python。听起来很简单,但不知怎么的,我一直有SegFault。我已经准备好了一切,以便返回的对象可以从Python中使用。如果我在Python中创建它的实例,它运行得很好,但当它从函数返回时,我无法使用它。这是相应的代码:
typedef struct{
PyObject_HEAD
op *grid;
double beta, *umatrix, *energies, weight;
int nflavours, opCount;
} SegmentTrace;
typedef struct{
PyObject_HEAD
double ratio;
} SegInsert;
static PyObject *segTr_insert(SegmentTrace *self, PyObject *args)
{
SegInsert *res = (SegInsert*)malloc(sizeof(SegInsert));
return Py_BuildValue("O", (PyObject*)res);
}
有了这些定义(以及相应的类型定义),我可以做到以下几点:
import cs
obj_1 = cs.segmentTrace(0., mat_a, mat_b)
obj_2 = cs.segInsert()
print obj_2.ratio
但不是:
import cs
obj_1 = cs.segmentTrace(0., mat_a, mat_b)
obj_3 = obj_1.insert()
print obj_3.ratio
出于某种原因,SegFault突然出现了——有人知道为什么吗?
谢谢,卢卡斯。
好吧,我想好了——至少有一个变通方法可以解决这个问题。无论如何,只是为了完整性:可以将Python中自己创建的Python-C对象传递给一些C例程,并在那里使用数据。也就是说,代替
obj_1 = cs.segmentTrace(0., mat_a, mat_b)
obj_3 = obj_1.insert()
用途:
obj_1 = cs.segmentTrace(0., mat_a, mat_b)
obj_3 = cs.segInsert(obj)
效果不错;)L.