您尚未登录。

楼主 # 2025-02-20 20:08:32

coollofty
会员
注册时间: 2025-02-07
已发帖子: 6
积分: 106

obj_run直接运行一段代码可以,但obj_linkLibrary之后再运行代码就不行

我的使用方法是:
1、先调用pikascript_entry得到pikaMain对象,将其做为全局对象
2、将代码从文件load上来后使用obj_run运行,这样一切正常

现在,我弄了两个py文件,用rust那个程序打包成了一个pikaModules.py.a文件,然后:
1、第1步上和面的一样不变
2、obj_linkLibraryFile加载pikaModules.py.a
3、obj_runModule(pikaMain, "main")这样来运行main.py

由于我自己注册了一些函数,是基于pikaMain这个对象来注册的。第一种方案,我自己注册的函数可以正常调用。第二种方案,我自己注册的函数会在obj_runModule(pikaMain, "main")的时候报找不到。为何呢?

离线

#1 昨天 11:36:32

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

Re: obj_run直接运行一段代码可以,但obj_linkLibrary之后再运行代码就不行

你自己注册的函数是不是不基于 pyi 的方式,应该要一律用 pyi 注册的方式来弄,这样才不会冲突

参考模块注册文档:https://pikapython.com/doc/index_cmodule.html

离线

楼主 #2 昨天 20:02:21

coollofty
会员
注册时间: 2025-02-07
已发帖子: 6
积分: 106

Re: obj_run直接运行一段代码可以,但obj_linkLibrary之后再运行代码就不行

lyon1998 说:

你自己注册的函数是不是不基于 pyi 的方式,应该要一律用 pyi 注册的方式来弄,这样才不会冲突

参考模块注册文档:https://pikapython.com/doc/index_cmodule.html

不是用的pyi,我是在pikaMain创建了之后,直接

obj_setObj(main, "SystemInfo", sysInfo);

这样注册的,这种方式在方案1上没问题,为何方案2就不行呢?其原因是啥?

我这个工程不太方便统一用pyi的方式,因为脚本部分被包装成了库,而这个注册是在应用程序模块中进行的。脚本库没法访问到仅在app模块里才有的量。所以我更希望知道背后的原因以及怎么解决这个问题

最近编辑记录 coollofty (昨天 20:03:19)

离线

#3 昨天 21:16:22

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

Re: obj_run直接运行一段代码可以,但obj_linkLibrary之后再运行代码就不行

@coollofty
方案1能运行才是意外的,现在的版本所有的注册都应该由pyi来去进行,就算封库了那也可以调用库的 API 吧

方案1即使能运行也是不可靠的,不知道哪里会出现奇怪的问题

注册机制内部比较复杂,现在唯一支持的方式就是 pyi 自动生成,要是不用 pyi,那就只能去找最古老的版本,或者自己研究内核

离线

页脚

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

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