在 C 和 Python 之间传递 C++ 指针
Posted
技术标签:
【中文标题】在 C 和 Python 之间传递 C++ 指针【英文标题】:Passing a C++ pointer between C and Python 【发布时间】: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 调用,这可能是它产生错误的原因。
【参考方案1】:
就像对您的问题的评论中所述,从局部变量 MyStruct var
读取数据时会遇到问题。为此,您可以使用PyCapsule_New
的第三个析构函数。
但这不是你刚才出现问题的原因。您在 args
参数上使用 PyCapsule_GetPointer(args, "testcapsule")
。由于它不是胶囊,即使var
是胶囊,您也可能已将函数的签名定义为METH_VARARGS
。相反,您需要解压缩元组或使用METH_O
。
【讨论】:
对迟到的回应表示歉意——但这正是问题所在。将函数签名更改为 METH_O 修复了 pycapsule 错误。非常感谢。以上是关于在 C 和 Python 之间传递 C++ 指针的主要内容,如果未能解决你的问题,请参考以下文章