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

Passing a C++ pointer between C and Python

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

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

为此,我尝试使用 PyCapsule 对象在 Python 和 C 之间传递指向这些对象的指针,但是当尝试在第二个 C 函数中读取它们时会产生错误 ("PyCapsule_GetPointer called with invalid PyCapsule object"). Python,但是,如果要求打印 PyCapsule 对象 (var),则正确地将其标识为“'capsule object "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;
}

感谢您的帮助。

正如在对您的问题的评论中所述,从局部变量 MyStruct var 读取数据时,您会 运行 遇到问题。为此,您可以使用第三个析构函数来 PyCapsule_New.

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