【发布时间】:2016-08-08 09:45:55
【问题描述】:
我有一个用 C++ 编写的 python 扩展模块,它包含多个函数。其中之一会生成一个自定义结构的实例,然后我想在 Python 中将其与我的模块的其他函数一起使用,如下所示
import MyModule
var = MyModule.genFunc()
MyModule.readFunc(var)
为此,我尝试使用 PyCapsule 对象在 Python 和 C 之间传递指向这些对象的指针,但这会在尝试在第二个 C 函数中读取它们时产生错误(“PyCapsule_GetPointer 调用了无效的 PyCapsule 对象”) .但是,如果要求 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;
}
感谢您的帮助。
【问题讨论】:
-
您的 capsule 指向一个仅在
genFunc期间存在的局部变量。我很惊讶你收到一条错误消息而不是崩溃。您需要分配var和malloc或使其成为全局变量或类似的东西,以确保它与胶囊一样长。 -
抱歉——这只是作为演示代码编写的;真实的例子有一些 malloc 调用,这可能是它产生错误的原因。
标签: python c++ c python-c-api