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

如何在C++中获取Python __builtin__模块的list类以创建Python列表?

解决C++中获取Python list类的问题

嘿,这个问题其实和Python版本的API变化以及更高效的API使用方式有关,我来帮你一步步解决:

为什么你的代码会失败?

在Python 3中,原来Python 2里的__builtin__模块已经被重命名为builtins了,所以如果你的代码运行在Python 3环境下,PyImport_ImportModule("__builtin__")会返回nullptr,自然找不到list类。就算是Python 2,其实也有更简洁可靠的方式获取list类型。

推荐的解决方案

方案1:直接使用Python C API提供的PyList_Type

这是最推荐的方式,因为PyList_Type是Python list类型的直接全局引用,不需要去模块里查找,而且兼容Python 2和3,代码更高效:

// 直接获取list类型对象
PyObject* o_list = (PyObject*)&PyList_Type;
// 验证是否有效(其实这个几乎不会失效,除非Python环境出问题)
if (o_list == nullptr) {
    cout << "Failed to get list type" << endl;
}

方案2:兼容Python 2/3的模块获取方式

如果你一定要通过内置模块获取list类,需要做版本判断,同时记得管理引用计数:

PyObject* o_builtin;
// 根据Python版本选择对应的模块名
#if PY_MAJOR_VERSION >= 3
    o_builtin = PyImport_ImportModule("builtins");
#else
    o_builtin = PyImport_ImportModule("__builtin__");
#endif

if (o_builtin == nullptr) {
    cout << "Failed to import builtins module" << endl;
    // 这里需要处理错误,比如返回或者进行资源清理
    return; // 示例:直接返回,根据你的代码逻辑调整
}

// 从模块的字典中获取list类
PyObject* o_list = PyDict_GetItemString(o_builtin, "list");
// 注意:o_list是借用的引用,不需要Py_DECREF,但o_builtin是新引用,必须释放
Py_DECREF(o_builtin);

if (o_list == nullptr) {
    cout << "could not find list in builtins" << endl;
}

方案3:直接创建列表对象(如果你的目标是创建列表)

如果你的最终目的是创建一个Python列表对象,完全不需要先获取list类,直接用PyList_New即可:

// 创建一个空列表(参数是初始元素个数,0表示空)
PyObject* my_list = PyList_New(0);
if (my_list == nullptr) {
    cout << "Failed to create list" << endl;
    // 处理创建失败的情况
}
// 后续可以用PyList_SetItem等API向列表中添加元素

额外注意事项

  • 确保你的C++代码链接的Python库版本和运行环境一致,版本不匹配也会导致各种奇怪的问题。
  • 操作Python对象时一定要注意引用计数:比如PyImport_ImportModule返回的是新引用,必须用Py_DECREF释放;而PyDict_GetItemString返回的是借用的引用,不需要手动释放。

内容的提问来源于stack exchange,提问作者0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:07