C 到 Python 接口 - 尝试传递结构
C to Python interface - Trying to pass structs
我目前正在研究 C 和 Python 之间的接口,我发现了一个我无法解决的问题:我想将一个结构传递给 Python。听起来很简单,但不知何故,我一直收到段错误。我已经准备好一切,以便返回的对象可以从 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
出于某种原因,出现了段错误 - 有人知道为什么吗?
谢谢,
卢卡斯
好的,我想通了 - 至少有一个解决方法可以解决问题。无论如何,只是为了完整起见:可以将自创建的 Python-C 对象从 Python 传递给某些 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.
我目前正在研究 C 和 Python 之间的接口,我发现了一个我无法解决的问题:我想将一个结构传递给 Python。听起来很简单,但不知何故,我一直收到段错误。我已经准备好一切,以便返回的对象可以从 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
出于某种原因,出现了段错误 - 有人知道为什么吗?
谢谢, 卢卡斯
好的,我想通了 - 至少有一个解决方法可以解决问题。无论如何,只是为了完整起见:可以将自创建的 Python-C 对象从 Python 传递给某些 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.