如何将返回的Python字典转换为C ++ std :: map <string,string =“”>

时间:2018-04-23 19:49:39

标签: python c++ c++builder

我从C ++调用Python,并尝试执行一些数据转换。

例如,如果我调用以下Python函数

def getAMap():
   data = {}
   data["AnItem 1"] = "Item value 1"
   data["AnItem 2"] = "Item value 2"
   return data

来自C ++:

PyObject *pValue= PyObject_CallObject(pFunc, NULL);

其中pFunc是指向getAMap python函数的PyObject *。 为清楚起见,省略了设置pFunc的代码。

返回的指针,pValue是指向(除其他外)Python字典的指​​针。 问题是,如何尽可能顺利地将字典放到C ++端的std :: map中?

我正在使用C ++ Builder bcc32编译器,它无法处理任何花哨的模板代码,如boost python或C ++ 11语法。

(更改问题,因为python对象是字典,而不是元组)

1 个答案:

答案 0 :(得分:0)

这很丑陋,但是我想出了这个:

std::map<std::string, std::string> my_map;

// Python Dictionary object
PyObject *pDict = PyObject_CallObject(pFunc, NULL);

// Both are Python List objects
PyObject *pKeys = PyDict_Keys(pDict);
PyObject *pValues = PyDict_Values(pDict);

for (Py_ssize_t i = 0; i < PyDict_Size(pDict); ++i) {
    // PyString_AsString returns a char*
    my_map.insert( std::pair<std::string, std::string>(
            *PyString_AsString( PyList_GetItem(pKeys,   i) ),
            *PyString_AsString( PyList_GetItem(pValues, i) ) );
}