如何将Python返回的字典转换为C++的std::map<string, string>
把Python字典转换为C++ std::map<string, string>的实现方案
嘿,刚好之前做过C++调用Python并处理字典返回值的需求,给你一步步拆解怎么实现这个转换:
首先,咱们得先确保返回的pValue确实是Python字典,不然直接操作会导致程序崩溃。然后遍历字典的每一对键值,把它们转换成C++的std::string,再插入到std::map里就行。还要注意Python对象的引用计数,避免内存泄漏。
完整代码示例
#include <map> #include <string> #include <Python.h> std::map<std::string, std::string> convert_pydict_to_stdmap(PyObject* pDict) { std::map<std::string, std::string> resultMap; // 第一步:检查传入的对象是不是Python字典 if (!PyDict_Check(pDict)) { PyErr_SetString(PyExc_TypeError, "Expected a Python dictionary"); return resultMap; } // 获取字典的所有键(返回的是一个Python列表) PyObject* pKeys = PyDict_Keys(pDict); if (!pKeys) { return resultMap; } Py_ssize_t keyCount = PyList_Size(pKeys); for (Py_ssize_t i = 0; i < keyCount; ++i) { // 获取列表中的第i个键(注意:PyList_GetItem返回的是借用的引用,不需要手动DECREF) PyObject* pKey = PyList_GetItem(pKeys, i); if (!PyUnicode_Check(pKey)) { // 如果键不是字符串类型,跳过或者处理错误 continue; } // 将Python字符串转换为C风格字符串(Python 3用PyUnicode_AsUTF8,Python 2用PyString_AsString) const char* keyStr = PyUnicode_AsUTF8(pKey); if (!keyStr) { continue; } // 根据键获取对应的值(同样是借用的引用) PyObject* pValue = PyDict_GetItem(pDict, pKey); if (!PyUnicode_Check(pValue)) { // 值不是字符串类型,跳过或处理错误 continue; } const char* valueStr = PyUnicode_AsUTF8(pValue); if (!valueStr) { continue; } // 插入到std::map中 resultMap[keyStr] = valueStr; } // 释放键列表的引用(因为PyDict_Keys返回的是新引用) Py_DECREF(pKeys); return resultMap; }
关键注意事项
- 类型检查不能少:一定要先判断
pValue是不是字典,键和值是不是字符串类型,否则遇到非预期类型会直接崩溃。 - 引用计数管理:
PyDict_Keys返回的是新的Python对象引用,必须用Py_DECREF释放;而PyList_GetItem和PyDict_GetItem返回的是借用的引用,不需要手动释放。 - Python版本兼容:如果是Python 2,字符串类型是
PyString_Type,要用PyString_AsString来转换;Python 3统一用PyUnicode_AsUTF8。 - 错误处理:示例里只是简单跳过错误的键值对,你可以根据需求改成抛出C++异常,或者设置Python错误状态让上层处理。
调用示例
在你的代码里,拿到pValue之后直接调用这个函数就行:
PyObject *pValue = PyObject_CallObject(pFunc, NULL); if (pValue) { std::map<std::string, std::string> myMap = convert_pydict_to_stdmap(pValue); // 这里可以使用myMap做后续操作 Py_DECREF(pValue); // 记得释放pValue的引用 } else { // 处理函数调用失败的情况,比如打印Python错误信息 PyErr_Print(); }
内容的提问来源于stack exchange,提问作者Totte Karlsson
相关产品推荐
相关产品推荐

