You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:15:29