原标题:[专栏作家]C#、Python大融合之术(三)
最近又是各种事,但自己挖的坑还是要填的。上篇说明了C++中python解释器的初始化,简单的运行python脚本,概述了C++调用python的要点--数据类型的处理。该篇我会讲python中的模块及函数如何加载和使用,先上基础代码:
其中我们已经完成了PyInitialize、PyFinalize、PyExecuteString,接下来,我们先实现模块的导入:
有人说,不是已经实现了执行python代码么,直接执行不就可以了?确实,我们可以执行导入的代码,然后直接用代码来调用函数,但是你会发现,你没有办法获取函数的返回值!这个很重要啊,如果获取不到python处理的返回值,那我们还要他干嘛呢?!先来看看PyImportModule的实现:
这里我们得先来了解下这个PyObject *类型。引用一下文档内容:
大致就是说PyObject*在pythonAPI中就是个基类,我的理解就是和Object是一样的咯!本来下面还有PyObject*结构的说明,这个等后面自定义类型再说。我们之后不管是传参还是处理返回值都会用到他,当然API中也有很多parse函数专门来处理PyObject*。有人问我_PyObjects是个啥,其实我这里写的不严谨,我应该把不同类的PyObject分开存放,这里的话就是用来存放已经加载的模块、函数,方便后面调用。再来看下这个函数的使用:
这样我们就把“t123”模块加载到pyEngine中了,接下来我们要调用它,先需要实现PyCallFuncFromModule:
以上代码先不考虑参数类型的转换和返回值的处理,我们可以看到,参数从C#传到C++是以Array的形式,为了可以让python使用,我们通过PyTuple_New来新建了一个元组存储参数:
处理好参数,我们通过moduleName从_PyObjects中把之前加载模块的PyObject取出来,使用PyModule_GetDict获得模块的命名空间。t123模块中简单的定义了一个F函数,查看其__dict__:
之后再用PyDict_GetItemString来找到“F”这个函数,作为
PyEval_CallObject是一个宏,用来实现python函数的调用,参数是PyObject *func和PyObject *args。我们把前面获得的函数F和参数代入PyEval_CallObject中,可以得到python处理后的返回值。获得返回值之后如何处理?等下一篇咯! 返回搜狐,查看更多
责任编辑: