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

如何在C++中读取Python函数返回的数组?

解决C++调用Python返回列表的问题

要处理Python函数返回的数组(列表),你需要使用Python C API提供的列表操作函数,核心步骤是验证返回类型、获取列表长度、逐个提取元素并转换为C++类型。以下是完整的实现代码和关键说明:

修改后的C++代码

#include <iostream>
#include <vector>
#include <C:\Python\Python312\include\python.h>

int main()
{
    PyObject* name, * load_module, * func, * callfunc, * args;
    std::vector<long> resultList;

    // 初始化Python解释器
    if (!Py_Initialize()) {
        std::cerr << "Python初始化失败" << std::endl;
        return 1;
    }

    // 加载PyFile模块
    name = PyUnicode_FromString("PyFile");
    load_module = PyImport_Import(name);
    Py_XDECREF(name); // 释放不再需要的对象

    if (!load_module) {
        std::cerr << "加载PyFile模块失败" << std::endl;
        Py_Finalize();
        return 1;
    }

    // 获取PyFnc2函数对象
    func = PyObject_GetAttrString(load_module, "PyFnc2");
    Py_XDECREF(load_module);

    if (!func || !PyCallable_Check(func)) {
        std::cerr << "获取PyFnc2失败或函数不可调用" << std::endl;
        Py_Finalize();
        return 1;
    }

    // 打包调用参数
    args = PyTuple_Pack(1, PyLong_FromLong(5));
    callfunc = PyObject_CallObject(func, args);
    Py_XDECREF(args);
    Py_XDECREF(func);

    if (!callfunc) {
        std::cerr << "调用PyFnc2失败" << std::endl;
        Py_Finalize();
        return 1;
    }

    // 处理返回的列表
    if (PyList_Check(callfunc)) {
        Py_ssize_t listSize = PyList_Size(callfunc);
        resultList.reserve(listSize);

        // 遍历列表提取每个元素
        for (Py_ssize_t i = 0; i < listSize; ++i) {
            PyObject* item = PyList_GetItem(callfunc, i);
            if (PyLong_Check(item)) {
                resultList.push_back(PyLong_AsLong(item));
            } else {
                std::cerr << "列表第" << i << "个元素不是整数" << std::endl;
            }
        }
    } else {
        std::cerr << "PyFnc2返回值不是列表类型" << std::endl;
    }

    // 输出结果
    std::cout << "返回的数组元素:";
    for (long val : resultList) {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    // 清理Python对象资源
    Py_XDECREF(callfunc);
    Py_Finalize();

    return 0;
}

关键操作说明

  • PyList_Check(callfunc):验证返回的PyObject是否为Python列表类型,避免后续操作出错。
  • PyList_Size(callfunc):获取列表的元素个数,返回类型为Py_ssize_t(对应C++的有符号整数类型)。
  • PyList_GetItem(callfunc, i):获取列表中第i个元素(索引从0开始),该函数返回的对象无需手动调用Py_DECREF,因为它是列表的内部引用。
  • PyLong_AsLong(item):将Python整数对象转换为C++的long类型;如果列表中是其他类型(如浮点数),可使用PyFloat_AsDouble等对应转换函数。
  • Py_XDECREF:安全释放Python对象,自动处理空指针情况,比Py_DECREF更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:02:45