C++ 调用Python文件方法传递字典参数并接收返回值
首先本地需要安装有Python环境,然后在c++工程中包含Python的头文件,引用Python的lib库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | //python 初始化 Py_Initialize(); if (!Py_IsInitialized()) { return ; } //运行脚本导入环境变量 PyRun_SimpleString( "import sys" ); PyRun_SimpleString( "import os" ); PyRun_SimpleString( "import string" ); //py文件的存放位置 string strPyPath = string( "sys.path.append('" ) + m_strPyLocation + string( "')" ); PyRun_SimpleString(strPyPath.c_str()); //载入py脚本 PyObject* pModule = PyImport_ImportModule( "pyscript" ); // PyImport_Import(pName); if (!pModule) { return ; } //获取py方法 PyObject* pFunc = PyObject_GetAttrString(pModule, "OnFunc" ); //PyDict_GetItemString(pDict, "pyscript"); if (!pFunc || !PyCallable_Check(pFunc)) { return ; } //构建py方法字典参数 PyObject *pArgsT = PyTuple_New(1); PyObject* pArgsD = PyDict_New(); PyDict_SetItemString(pArgsD, "key" , Py_BuildValue( "s" , "value" )); PyTuple_SetItem(pArgsT, 0, pArgsD); //调用py方法 PyObject *pReturn = PyEval_CallObject(pFunc, pArgsT); //PyObject_CallObject(pFunc, pArgs); if (pReturn == NULL) { return ; } //获取py返回值 PyArg_Parse(pReturn, "s" , &szBuffer); //char szBuffer[256] = {0}; //clear Py_DECREF(pName); Py_DECREF(pDict); Py_DECREF(pModule); Py_DECREF(pFunc); Py_DECREF(pArgsT); Py_DECREF(pArgsD); Py_DECREF(pReturn); Py_Finalize(); |
pyscript.py脚本示例
1 2 3 4 | def OnFunc(params): ret = '' ret + = params[ "key" ] return ret |
附加 返回值 Tuple-List 解析
//调用py方法 PyObject *pReturnTuple =PyObject_CallObject(pFunc, pArgsT0); //PyEval_CallObject(pFunc, pArgsT0); if (pReturnTuple == NULL) return 0; int nTupleSize = PyTuple_Size(pReturnTuple); for (int l = 0; l < nTupleSize; l++) { PyObject *pTupleList = PyTuple_GetItem(pReturnTuple, l); int nTupleListSize = PyList_Size(pTupleList); for (int m = 0; m < nTupleListSize; m++) { PyObject* pTupleListValue = PyList_GetItem(pTupleList, m); int nValue = 0; PyArg_Parse(pTupleListValue, "i", &nValue); std::cout << nValue << std::endl; } }

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述