簡體   English   中英

使用SWIG將C ++對象指針傳遞給Python,而不是再次返回C ++

[英]Using SWIG to pass C++ object pointers to Python, than back to C++ again

我正在使用SWIG來包裝2個C ++對象,我在我的應用程序中嵌入Python解釋器(即我自己調用PyInitialize()等)。

第一個對象是某些應用程序數據的包裝器。 第二個是“輔助”對象,也是用C ++編寫的,它可以根據它在數據對象中找到的內容執行某些操作。

python腳本決定何時/如何/如何調用輔助對象。

所以我將指向我的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中,我們看到類似的東西:

def go(dataobj, helperobj):
    ## if conditions are right....
    helperobj.helpme(dataobj)

現在,除了一件事,這在很大程度上起作用。 在我的C ++代碼中,當我准備傳遞給Python腳本的參數時,我會觀察到PointerToMyDataObject的指針值。

當我在helperobj.helpme()的C ++實現中設置斷點時,我看到內存地址是不同的,盡管它似乎是指向MyDataObject的有效實例的指針。

這對我來說很重要,因為“MyDataObject”實際上是一些可能的派生類的基類。 我的幫助對象想要在它接收的指針上執行適當的(由上下文確定)動態轉換,以指向適當的派生類。 我現在認為這是顯而易見的原因。

我在SWIG中讀到了一些關於“陰影”物體的事情,這只會增加我的困惑(為我的小腦道歉:-P)

那么,SWIG是出於某種原因制作了我的對象的副本,然后將指針傳遞給副本? 如果是,那么我就能理解為什么我對動態演員表的假設不起作用。

我試圖將此作為評論添加,但在格式化方面遇到了困難,所以......更多的見解如下:問題與傳遞引用有關。 注意我有2個虛擬方法helpMe()的實現:

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

雖然我為python提供了一個指針,但它正在調用pass-by-reference版本。 這解釋了為什么我得到不同的指針值。 但是,我可以做什么來強制調用帶有指針參數的版本?

基於你所展示的內容,我認為你想確保SWIG只能看到helpMe的指針版本。 非指針版本將創建一個臨時副本,然后將其傳遞給函數,聽起來這不是你想要的。

SWIG將很難選擇使用哪個版本,因為它略微抽象了指針概念以更好地匹配Python。

您可以在聲明之前使用%ignore隱藏SWIG中的非指針版本,或者在接口文件中將其顯示為SWIG的%import

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM