在 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 期间存在的局部变量。我很惊讶你收到一条错误消息而不是崩溃。您需要分配 varmalloc 或使其成为全局变量或类似的东西,以确保它与胶囊一样长。 抱歉——这只是作为演示代码编写的;真实的例子有一些 malloc 调用,这可能是它产生错误的原因。 【参考方案1】:

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

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

【讨论】:

对迟到的回应表示歉意——但这正是问题所在。将函数签名更改为 METH_O 修复了 pycapsule 错误。非常感谢。

以上是关于在 C 和 Python 之间传递 C++ 指针的主要内容,如果未能解决你的问题,请参考以下文章

通过 Boost Python 在 C++ 对象之间传递共享指针的 Segfault

C ++中的指针和引用之间是不是存在任何开销差异[重复]

在c ++函数中返回地址和返回指针之间的区别[重复]

void 指针:C 和 C++ 之间的区别

Java的引用c++的引用和C指针的区别

在C语言中,函数实参与形参之间的数据传递方式是( )传递方式。