在C和Python之间传递C ++指针

时间:2016-08-08 09:45:56

标签: python c++ c python-c-api

我有一个用C ++编写的python扩展模块,它包含多个函数。其中一个生成一个自定义结构的实例,然后我想在Python中使用我的模块的其他函数,如下所示

import MyModule
var = MyModule.genFunc()
MyModule.readFunc(var)

为此,我尝试使用PyCapsule对象在Python和C之间传递指向这些对象的指针,但是当尝试在第二个C函数中读取它们时会产生错误(" PyCapsule_GetPointer调用无效的PyCapsule对象")。但是,如果要求打印PyCapsule对象(var),则可以正确地将其标识为"''胶囊对象" testcapsule"'。我的C代码如下所示:

struct MyStruct {
    int value;
};

static PyObject* genFunc(PyObject* self, PyObject *args) {
    MyStruct var;
    PyObject *capsuleTest;

    var.value = 1;
    capsuleTest = PyCapsule_New(&var, "testcapsule", NULL);
    return capsuleTest;
}

static PyObject* readFunc(PyObject* self, PyObject *args) {
    PyCapsule_GetPointer(args, "testcapsule");
    return 0;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如同您对问题的评论中所述,从本地变量MyStruct var读取数据时会遇到问题。为此,您可以使用第三个析构函数PyCapsule_New

但这不是你刚才问题的原因。您在PyCapsule_GetPointer(args, "testcapsule")参数上使用args。由于它不是一个包,即使var是一个,你可能已经将该函数的签名定义为METH_VARARGS。相反,您需要解压缩元组或使用METH_O