c# python3_[专栏作家]C#、Python大融合之术(三)

原标题:[专栏作家]C#、Python大融合之术(三)

最近又是各种事,但自己挖的坑还是要填的。上篇说明了C++中python解释器的初始化,简单的运行python脚本,概述了C++调用python的要点--数据类型的处理。该篇我会讲python中的模块及函数如何加载和使用,先上基础代码:

90b6c42e5e6c75e5defc1e226a5a3924.png

aa5b11515ab8d5618a4f961b0992b5bd.png

7f72bbdb6e2492d78e8e7b24b9956d88.png

其中我们已经完成了PyInitialize、PyFinalize、PyExecuteString,接下来,我们先实现模块的导入:

2e101c72b024f45eb7fa1251eb9ec820.png

有人说,不是已经实现了执行python代码么,直接执行不就可以了?确实,我们可以执行导入的代码,然后直接用代码来调用函数,但是你会发现,你没有办法获取函数的返回值!这个很重要啊,如果获取不到python处理的返回值,那我们还要他干嘛呢?!先来看看PyImportModule的实现:

ec6260dbbc2c254cfc7bd012d09101dd.png

这里我们得先来了解下这个PyObject *类型。引用一下文档内容:

55dde6e9a29458058d949342b68c0510.png

大致就是说PyObject*在pythonAPI中就是个基类,我的理解就是和Object是一样的咯!本来下面还有PyObject*结构的说明,这个等后面自定义类型再说。我们之后不管是传参还是处理返回值都会用到他,当然API中也有很多parse函数专门来处理PyObject*。有人问我_PyObjects是个啥,其实我这里写的不严谨,我应该把不同类的PyObject分开存放,这里的话就是用来存放已经加载的模块、函数,方便后面调用。再来看下这个函数的使用:

e5168739d70c5487ad89bf3a891421da.png

这样我们就把“t123”模块加载到pyEngine中了,接下来我们要调用它,先需要实现PyCallFuncFromModule:

0aa590074b649039776701cc47c925a9.png

e8e0f7d494d44e7f3c49bc7d88a26549.png

以上代码先不考虑参数类型的转换和返回值的处理,我们可以看到,参数从C#传到C++是以Array的形式,为了可以让python使用,我们通过PyTuple_New来新建了一个元组存储参数:

7d8dcb8fb4cedb5d7365fd7c67e182ea.png

处理好参数,我们通过moduleName从_PyObjects中把之前加载模块的PyObject取出来,使用PyModule_GetDict获得模块的命名空间。t123模块中简单的定义了一个F函数,查看其__dict__:

df37a476c1a840dfcff14a94c84e1d2b.png

之后再用PyDict_GetItemString来找到“F”这个函数,作为

ece3f04761bf1c642c04f2954d343165.png

PyEval_CallObject是一个宏,用来实现python函数的调用,参数是PyObject *func和PyObject *args。我们把前面获得的函数F和参数代入PyEval_CallObject中,可以得到python处理后的返回值。获得返回值之后如何处理?等下一篇咯! 返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值