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

3

我正在从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对象是字典而不是元组,所以更改了问题)


另外,考虑使用 [tag:swig]。 - Robᵩ
Rob,事实上我正在使用swig。 - Totte Karlsson
我会使用PyTuple_GetItem并将值复制到映射中。或者编写一个Swig类型映射来自动完成这个过程。 - Thomas
谢谢Thomas。我对swig和嵌入Python不太熟悉。我想使用typemap来解决它,所以正在研究一下。 - Totte Karlsson
https://dev59.com/23I-5IYBdhLWcg3wc4Cw - ssk
显示剩余4条评论
1个回答

1
“这个很丑,但我想出了这个:”
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) ) );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接