根据这个帖子:
【pikascript】如何实现 C 调用 python 定义的函数?
https://whycan.com/t_7976.html
C模块调用obj_setStr和obj_run这两个函数来回调py模块函数,但这两个函数需要传入py模块对象,如果py模块能把自己的模块名传给C模块,C模块如何通过名字获取到py对象呢?或者有其他能直接传递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
离线