簡體   English   中英

將SWIG C ++轉換為Python:返回std :: list作為Python的參數

[英]SWIG C++ to Python: returning an std::list as an argument to Python

我正在嘗試從Python調用C ++中的方法,該方法返回std :: list作為參數。

這是C ++原型:

void FindAllServices(int id, std::list<Service*> &services)

這是我的std :: list的類型映射:

%typemap(in) (std::list<Service*> &) (std::list<Service*> temp) {
  $1 = &temp;
}

%typemap(argout) (std::list<Service*>&) {
    Py_XDECREF($result);   /* Blow away any previous result */
    $result = PyList_New((*$1).size());
    qList<Service*>::iterator it = (*$1).begin();
    int i = 0;
    while(it != (*$1).end()) {
        PyList_SetItem($result,i,SWIG_NewPointerObj((void*)(*it), SWIGTYPE_p_Service, 0));
        it++; i++;
    }
}

當我從Python調用函數時,我可以插入C ++代碼並看到一切都很好(即,某些Service指針已復制到列表中)。 但是,我在Python中獲得的列表為空。

你知道我可能做錯了什么嗎?

謝謝!

這是我正在使用的代碼。 效果很好。

%typemap(out) std::list<AbnormalCondition>
{
    PyObject* outList = PyList_New(0);

    int error;

    std::list<AbnormalCondition>::iterator it;
    for ( it=$1.begin() ; it != $1.end(); it++ )
    {
        AbnormalCondition object = (*it);

        PyObject* pyAbnormalCondition = SWIG_NewPointerObj((new AbnormalCondition(static_cast< const AbnormalCondition& >(object))), SWIGTYPE_p_AbnormalCondition, SWIG_POINTER_OWN |  0 );

        error = PyList_Append(outList, pyAbnormalCondition);
        Py_DECREF(pyAbnormalCondition);
        if (error) SWIG_fail;       
    }

    $result = outList;
}

%typemap(in) std::list<AbnormalCondition>
{
    //$input is the PyObject
    //$1 is the parameter

    if (PyList_Check($input))
    {
        std::list<AbnormalCondition> listTemp;

        for(int i = 0; i<PyList_Size($input); i++)
        {
            PyObject* pyListItem = PyList_GetItem($input, i);

            AbnormalCondition* arg2 = (AbnormalCondition *) 0 ;

            int res1 = 0;
            void *argp1;

            res1 = SWIG_ConvertPtr(pyListItem, &argp1, SWIGTYPE_p_AbnormalCondition,  0  | 0);
            if (!SWIG_IsOK(res1))
            {
                PyErr_SetString(PyExc_TypeError,"List must only contain AbnormalCondition objects");
                return NULL;
            }  
            if (!argp1)
            {
                PyErr_SetString(PyExc_TypeError,"Invalid null reference for object AbnormalCondition");
                return NULL;
            }

            arg2 = reinterpret_cast< AbnormalCondition * >(argp1);
            listTemp.push_back(*arg2);
        }

        $1 = listTemp;
    }
    else
    {
        PyErr_SetString(PyExc_TypeError,"Wrong argument type, list expected");
        return NULL;
    }
}

您的argout代碼創建一個新列表。 您必須獲得對原始列表的引用,然后對其進行修改。 我不知道喝酒,所以我不知道該怎么做。

對於python接口,我通常會對其進行包裝,以便返回新列表,而不是修改傳入列表。 這是C ++的一種習語,但實際上不是python的一種。

暫無
暫無

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

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