【问题标题】:C to Python interface - Trying to pass structsC 到 Python 接口 - 尝试传递结构
【发布时间】:2015-03-31 23:59:00
【问题描述】:

我目前正在研究 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 c struct interface segmentation-fault


【解决方案1】:

好的,我想通了 - 至少有一个解决方法可以解决问题。无论如何,只是为了完整起见:可以将自创的 Python-C-Objects 从 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.

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 2011-01-19
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多