python代码热更原理及实现 |
您所在的位置:网站首页 › 简单python程序代码 › python代码热更原理及实现 |
一、简介:
热更,指程序具有在运行过程中修改代码,不重启,而直接生效的能力。 热更对代码的微调,debug非常友好,不再需要重新启动程序,能直接在已有的上下文环境中直接测试。 二、接入流程: 将 hot_update 文件夹复制到项目根目录在程序启动代码里,添加以下代码 import hot_upate hot_update.start() 启动程序之后,hot_update 文件夹下会自动创建两个 .txt 文件 hot_update |-- __init__.py |-- update_file.txt * # 热更新操作文件 |-- update_log.txt * # 日志文件至此热更环境已配置成功 三、使用:如果需要更新某个文件,只需要在 update_file.txt 文件下写需要更新的文件,在1~2秒的延迟之后, 可检查update_log.txt文件判断是否更新成功 程序会每秒检查 update_file.txt 文件,找到第一个 没有#号的行,然后对其进行热更 场景1: 问题:我在 ui.kv.sale.sale_screen 目录下修改了一行代码,怎么热更?如果是多个文件呢?处理:在 update_file.txt 中写上需要更新的文件(如下),然后保存。ui.kv.sale.sale_screen 多个文件以 , 分割ui.kv.sale.sale_screen,ui.kv.sale.total_bar 然后查看 update_log.txt 如果出现更新成功提示,则代表成功(如下)2022-11-28 16:09:03 更新文件: ui.kv.sale.sale_screen ok场景2: 问题:我不想每次都输入一遍文件路径,有没有办法?处理:在对应行随便一个地方加上 #,该行不会被热更,会继续往下寻找第一个没有 # 的行热更ui.kv.sale.sale_screen,ui.kv.sale.total_bar # 四、原理简单介绍 1、引入reloadpython 中有个 reload函数,会对模块进行重新加载, 例如对模块 A 执行,reload(A),则模块 A 中的模块级内容会重新加载。 不过,被reload的模块中,某个类已经生成的对象,依然指向的是旧模块的代码。也就是说,你在某个类的方法中添加了一行打印, 热更之后这些已经存在的对象并不会生效。 2、已存在对象的处理而这些对象该怎么处理? 首先是需要理解python类函数的执行流程。 对象执行函数,都知道需要传入一个 self,所以理解以下内容应该不是难事: 对象在执行某个函数时,其实是执行的一个普通类函数,然后传入当前对象。 而类函数也是引用的一个普通函数,所以当reload某个模块,将类重新加载之后,需要做到: 仅仅只是更新函数代码,保留类的旧环境(类属性的值等等) 因为已有的对象是指向的旧类,所以其中一种方式就是对新生成的类和旧对象所引用的类进行改造 旧对象引用的类,将类中的方法引用指向新生成类的方法新类指向旧类,使下次创建对象能保留之前类环境从而做到,仅热跟代码,而保存已有的运行环境 想要了解更多细节,可以看看这篇文章,写的很通俗易懂 传送门 五、后续拓展 1、增加ui可以再 pos 程序中增加一个ui界面,直接输入需更新的文件,写入 update_file.txt。增加一个线程,定时读取update_log.txt ,将当前的信息展示到界面上,做到实时判断是否更新成功(当然也可以给右下角的非阻塞弹窗提示) 2、热更 .kv 文件对项目 kv 暂时不太熟悉,不过应该是可行的。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |