C++嵌入Python实现int变量互传的最简代码求助及实现
C++嵌入Python实现参数传递与结果获取案例
我刚入门,所以请不要给我贴200行仅用来转换int的代码。我需要尽可能精简、尽量少用晦涩命令的实现。
我花了好几个小时想找最入门级的示例却一无所获,试过PyArg_ParseTuple、PyArg_Parse、Py_BuildValue等无数方法,可能是语法用错了,但所有文档都没有对应示例。为了这么个本该非常 trivial 的功能耗了几小时,我十分沮丧。
我只想在C代码中嵌入一个小型Python函数,最简需求是:把C int变量a1传给Python函数,和b1相加后获取返回值,在C中用cout打印。
已有代码框架
PyObject *pmod1; int a1 = 20; int cresult = 0; int b1 = 0; Py_Initialize(); pmod1 = PyImport_ImportModule("usermod"); (GAP HERE) std::cout << cresult << " " << a1 << " " << b1; Py_Finalize();
Python模块(usermod.py)内容
pythb1 = 5; def ThisFunc(a,b): result = a+b return result
具体需求
我要实现的逻辑是:将C int变量a1传给ThisFunc的参数a,pythb1传给参数b,返回的result赋值给cresult用cout打印,同时读取Python中的pythb1赋值给C++的b1变量,最终cout输出应为:25 20 5。
我试过的方法里包括long a1(PyLong_AsLong(pmod3));,其中pmod3是Python对象,会导致程序无报错直接崩溃。
最终可运行实现
多次更新:我自己摸索出了实现方法,改编了书中找到的示例,除此之外网上找不到任何有用参考。经过无数次尝试修改终于完成,代码可编译运行,我不知道是不是标准实现,但达到了预期效果。这个场景的坑点是变量名写错编译器不会报错,和C++代码逻辑不同。
最终可运行代码如下:
PyObject *pmod, *pdict, *pvar, *presult, *pa1; long a1 = 20, b1, cresult; Py_Initialize(); pmod = PyImport_ImportModule("usermod"); pdict = PyModule_GetDict(pmod); pvar = PyRun_String("pythb1", Py_eval_input, pdict, pdict); // 读取Python脚本中定义的pythb1并存入pvar对象 if(PyLong_Check(pvar)){ b1 = (PyLong_AsLong(pvar)); // 将Python对象pythb1/pvar转换为C long类型赋值给b1,Python中似乎只有long整型 } pa1 = (PyLong_FromLong(a1)); // 将C long类型的a1转换为Python对象 PyObject_SetAttrString(pmod, "X1", pa1); PyObject_SetAttrString(pmod, "X2", pvar); presult = PyRun_String("ThisFunc(X1,X2)", Py_eval_input, pdict, pdict); if(PyLong_Check(presult)){ cresult = (PyLong_AsLong(presult)); } std::cout << cresult << " " << a1 << " " << b1 << std::endl; Py_DECREF(pmod); // 资源清理 Py_DECREF(pvar); Py_DECREF(presult); Py_DECREF(pa1); Py_Finalize();
输出为25 20 5,完全符合预期。显然这个需求可以实现,但不知为何网上找不到相关示例,我只希望这部分能有更多更完善的文档。
内容的提问来源于stack exchange,提问作者Abalieno
相关产品推荐
相关产品推荐

