使用SWIG将C++对象指针传递给Python,而不是返回到C++

2024-10-02 16:25:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用SWIG来封装2个C++对象,我将Python解释器嵌入到我的应用程序中(即调用pyRelialZe()等)。在

第一个对象是一些应用程序数据的包装器。 第二个是“助手”对象,也用C++编写,它可以根据它在数据对象中找到的东西执行某些操作。在

python脚本决定何时/如何/是否调用helper对象。在

所以我把一个指针传递给我的C++对象,以便SWIG/Python这样:

swig_type_info *ty = SWIG_MangledTypeQuery("_p_MyDataObject");
if(ty == NULL)
 {
    Py_Finalize();
     return false;
 }

PyObject *data_obj = SWIG_NewPointerObj(PointerToMyDataObject, ty, 0);
if(data_obj == NULL)
{
     Py_Finalize();
     return false;
}

ty = SWIG_MangledTypeQuery("_p_MyHelperObject");
 if(ty == NULL)
{
     Py_Finalize();
    return false;
 }

PyObject *helper_obj = SWIG_NewPointerObj(PointerToMyHelperObject, ty, 0);
if(helper_obj == NULL)
{
    Py_Finalize();
    return false;
}
PyTuple_SetItem(pArgs, 0, data_obj);
PyTuple_SetItem(pArgs, 1, helper_obj);
PyObject *pValue = PyObject_CallObject(pFunc, pArgs);
if(pValue == NULL)
{
     Py_Finalize();
     return false;
}

在Python中,我们可以看到如下内容:

^{pr2}$

现在,除了一件事,这基本上是有效的。在我的C++代码中,当我准备将参数传递给Python脚本时,我观察POTIFOTYDATAObjor的指针值。在

当我在C++实现中设置断点时救命啊,救命啊(),我看到内存地址不同,尽管它似乎是指向MyDataObject的有效实例的指针。在

这对我很重要,因为“MyDataObject”实际上是一些可能的派生类的基类。我的helper对象希望对它接收到的指向相应派生类的指针执行适当的(由上下文决定)动态转换。这是失败的,我认为这是显而易见的原因。在

我在SWIG里读过一些关于“影子”物体的东西,这只会增加我的困惑(为我的小脑袋道歉:-p)

那么,SWIG是否出于某种原因复制了我的对象,然后传递了一个指向该副本的指针?如果是这样,那么我就可以理解为什么我关于动态强制转换的假设不会起作用。在

我试图将此添加为注释,但在格式设置上遇到困难,所以。。。。。更多细节如下: 这个问题与参照传递有关。注意,我有两个方法helpMe()的实现:

bool MyHelperObject::helpMe(MyDataObject mydata_obj)
{
    return common_code(&mydata_obj);
}
bool MyHelperObject::helpMe(MyDataObject *mydata_obj)
{
    return common_code(mydata_obj);
}

虽然我为python提供了一个指针,但它调用的是引用传递版本。这解释了为什么我得到不同的指针值。但是我能做些什么来强制调用接受指针参数的版本呢?在


Tags: 对象pyhelperfalseobjreturnifnull
1条回答
网友
1楼 · 发布于 2024-10-02 16:25:39

根据您展示的内容,我想您应该确保SWIG只能看到helpMe的指针版本。非指针版本将创建一个临时副本,然后将其传递到函数中,这听起来不是您想要的。在

SWIG很难选择使用哪个版本,因为它稍微抽象了指针概念,以便更好地匹配Python。在

您可以在声明之前使用%ignore或在接口文件中将其显示给SWIG的%import隐藏SWIG的非指针版本:

%ignore MyHelperObject::helpMe(MyDataObject mydata_obj)
%import "some.h"

相关问题 更多 >