您尚未登录。

楼主 # 2022-03-20 21:28:21

jtp108
会员
注册时间: 2022-03-20
已发帖子: 2
积分: 7

C模块回调函数如何获取py模块对象

根据这个帖子:
【pikascript】如何实现 C 调用 python 定义的函数?
https://whycan.com/t_7976.html

C模块调用obj_setStr和obj_run这两个函数来回调py模块函数,但这两个函数需要传入py模块对象,如果py模块能把自己的模块名传给C模块,C模块如何通过名字获取到py对象呢?或者有其他能直接传递py对象的方法?

离线

#1 2022-03-20 22:17:33

lyon1998
Moderator
注册时间: 2021-12-01
已发帖子: 108
积分: 55

Re: C模块回调函数如何获取py模块对象

@jtp108

pikascript 的对象是用对象树来组织的,也就是只要获得根对象,就可以获得所有的对象。

在启动 pikascript 时,pikascriptInit 函数会创建一个根对象,并执行 main.py 里面的脚本。

PikaObj* pikaMain = pikascriptInit();

main.py里面,看似执行的都是全局函数,创建和修改的都是全局变量,但实际上,在 pikascript 引擎中,全局变量和全局函数,就是根对象的属性和方法。

所以,只要通过根对象,就可以获得 main.py 里面任意一个对象。

例如,如果在 main.py 中创建一个 mem 对象:

mem = PikaScript.Memchecker()

那么在 C 中获得 mem 对象的方法就是:

PikaObj* mem = obj_getPtr(pikaMain, "mem");

就是获得 pikaMain 对象下的 "mem" 属性,类型是指针。

也可以获得嵌套的对象,比如,如果有一个全局的对象 IIC,然后该对象有 pin 子对象。

那么获得 pin 子对象的方法就是:

PikaObj* pin = obj_getPtr(pikaMain, "IIC.pin");

或者分两步获得:

PikaObj* IIC = obj_getPtr(pikaMain, "IIC");
PikaObj* pin = obj_getPtr(IIC, "pin");

如果是在 C 模块的回调函数中,想要获得根对象,那么可以通过 PikaScript 自动创建的根对象全局指针。

extern PikaObj* __pikaMain;

在执行 pikascriptInit()时,会自动创建一个 __pikaMain 全局指针,用来指向根对象。

参考文档:

1. pikascript 对象结构的原理
https://pikadoc.readthedocs.io/zh/latest/%E5%8E%9F%E7%90%86%E7%AE%80%E4%BB%8B.html

2. pikascript 对象API
https://pikadoc.readthedocs.io/zh/latest/Pika%20%E5%AF%B9%E8%B1%A1%20PikaObj.html

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn