您尚未登录。

#1 Re: PikaPython(嵌入式Python引擎) » 求助,又碰上问题了:obj_linkLibrary之后再obj_run则无法使用之前已定义的函数 » 2025-03-12 18:08:11

没有线程安全问题,虽然有多线程,但是所有代码包括lvgl渲染都跑在主线程里,线程用来运行播放器、网络curl请求这些,如果有通知或异步调用,也都是用Message的方式Post到主线程去调用的。脚本只在主线程,所以,线程安全问题肯定是不存在的。


今天发现我在这个.a里面定义了一个变量,在另外一次obj_run的代码里去访问这个变量里的值是可以的,但是调用函数就会报上面那个错误,不管调用这个.a里的哪个函数,都是这个样子

这个问题还有什么可能?

#2 PikaPython(嵌入式Python引擎) » 求助,又碰上问题了:obj_linkLibrary之后再obj_run则无法使用之前已定义的函数 » 2025-03-11 18:47:44

coollofty
回复: 3

obj_linkLibrary了一个.a文件,比如这里面定义了一个createWidget函数
过几帧后再用obj_run函数运行一段代码,代码中调用这个createWidget,函数是存在的,但是只要一调用就会报异常:

Assertion "strGetSize(method_dec) <= size" failed, in function: methodArg_getTypeList().
  (at E:\projects\aipeiban\lv_binding_pikascript\LVGL.Simulator\pikascript\pikascript-core\PikaObj.c:1062)

而如果直接在这个.a库的代码里调用这个函数又没问题,这是为啥呢?

我肯定是需要在多处多次运行不同的代码的,而这个.a文件里的代码可以理解为就是我为我的工程写的全局库,各种python写的工具函数。这个问题不会无解吧?

#3 PikaPython(嵌入式Python引擎) » 有没有可能实现最简单的react模式? » 2025-03-08 19:51:04

coollofty
回复: 2

从目前来看引擎层面只要有一个getter和setter响应能力,就可以实现最简单的react了

#4 PikaPython(嵌入式Python引擎) » 引入一个.a模块运行一段时间之后,如何完整的卸载这个模块及所有相关占用? » 2025-03-07 15:00:30

coollofty
回复: 2

因为我的程序会在运行过程中根据情况载入多个.a库,可以理解为一个.a就是一个app,运行一段时间之后这个app退出了,我就需要完整的卸载这个.a库以及其运行过程中所有占用的内存等资源。python代码里可能会忘记处理某些东西,但是我能否强制卸载掉?

原来我的方案是想创建两个python对象,一个负责主程序,这个是全局一直存在的。另一个负责一些后来运行的代码,就像app一样,运行完了我可以销毁整个python引擎,这样应该是最好的。但是我看代码里有很多全局变量,这样做估计是不现实吧?所以只能想着上面那个方案,能否整体卸载了

#5 Re: PikaPython(嵌入式Python引擎) » obj_run直接运行一段代码可以,但obj_linkLibrary之后再运行代码就不行 » 2025-02-21 20:02:21

lyon1998 说:

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

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

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

obj_setObj(main, "SystemInfo", sysInfo);

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

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

#6 PikaPython(嵌入式Python引擎) » obj_run直接运行一段代码可以,但obj_linkLibrary之后再运行代码就不行 » 2025-02-20 20:08:32

coollofty
回复: 3

我的使用方法是:
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")的时候报找不到。为何呢?

#7 Re: PikaPython(嵌入式Python引擎) » 在PC上用哪个函数可以把加载的代码转成字节码? » 2025-02-13 14:41:24

@lyon1998
意思是在当前目录下运行那个rust程序,他会把所有目录下的py文件都编译出来,对吧

#8 PikaPython(嵌入式Python引擎) » 在PC上用哪个函数可以把加载的代码转成字节码? » 2025-02-09 17:43:57

coollofty
回复: 4

我这边需要在PC上手动完成字节码的编译,找了一下文档中只提到了那个rust程序可以自动打包,但我这边的场景是在运行的时候还需要下载几个代码文件,我想在PC上转好了再给IOT设备去跑

#9 Re: PikaPython(嵌入式Python引擎) » 代码放在函数里和不放在函数里,执行结果居然完全不同 » 2025-02-09 15:44:11

嗯,确定是空行问题,只要将空行加入和上一行结构相同的空格,问题就解决了。
另外,这个REPL模式我并没有在哪里看到有解释说明,能否提供一些资料我了解一下什么是REPL,谢谢

#10 PikaPython(嵌入式Python引擎) » 代码放在函数里和不放在函数里,执行结果居然完全不同 » 2025-02-07 21:13:43

coollofty
回复: 3
import pika_lvgl as lv

scr = lv.scr_act()
inputH = SystemInfo.fontHeight * 3.5

def createUIToWifiServer(evt):
	wm = WifiManager()
	r = wm.scan()
	if (r < 0):
		print('WifiScan error:', r)
	else:
		for i in range(r):
			wm.get(i)


def createUIToKeyboard(evt):
	kbInput = lv.textarea(scr)
	kbInput.set_pos(0, 0)
	kbInput.set_size(scr.get_width(), inputH)

	kb = lv.keyboard(scr)
	kb.set_textarea(kbInput)

	print('-------1')
	span = lv.label(scr)
	print('-------1')
	span.set_pos(0, inputH + 8)
	span.set_size(scr.get_width(), inputH)
	span.set_flex_align(lv.FLEX_FLOW.ROW_WRAP, lv.FLEX_ALIGN.CENTER, lv.FLEX_ALIGN.CENTER)
	print('-------1')
	span.set_text('')
	print('-------2')

	tip = lv.label(span)
	tip.set_text('如键盘无法设置密码,可尝试更换方式连接')

	chgMode = lv.btn(span)
	chgMode.set_pos(SystemInfo.fontHeight * 20, inputH + 8)
	chgMode.add_event_cb(createUIToWifiServer, lv.EVENT.CLICKED, 0)
	lv.label(chgMode).set_text('使用手机设置 >')	


createUIToKeyboard(None)

上面这段代码,如果我将createUIToKeyboard函数去掉,将代码向左缩进一格直接执行,就没有任何问题。而这样放在函数里,则只能执行到kb.set_textarea(kbInput)这一行之前,这个函数就不再返回了,后面的print不会执行。这是为何?

页脚

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

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