在 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
.
我有一个用 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
.