我从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对象是字典,而不是元组)
答案 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) ) );
}