如何在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
相关产品推荐
相关产品推荐

