Python实现模块热加载

pytest框架之热加载 阅读详情

包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取 10)%免费!】

为什么需要热加载

在某些情况,你可能不希望关闭Python进程并重新打开,或者你无法重新启动Python,这时候就需要实现实时修改代码实时生效,而不用重新启动Python

在我的需求下,这个功能非常重要,我将Python注入到了其他进程,并作为一个线程运行。如果我想关闭Python,要么杀死Python相关的线程,要么重新启动进程,这都比较麻烦。所以当我修改完代码后,热加载代码是最方便的方法

Python中的导入机制

我们重复导入一个库时,第二次导入时并没有运行库里面的代码,比如先写一个a.py,在里面写一行代码print("a模块加载"),然后在写一个b.py, 里面写两行import a。即使你在多线程中再导入一遍a模块,也不会打印。例如下面的代码:

import a
import threading
print(id(a))

def test():
    import a
    print(id(a))

threading.Thread(target=test).start()

可以看到a的id是一样的,也就是同一个对象。

为什么会这样呢?这和Python的模块导入机制有关,Python会在sys.modules这个字典里存储着所有的全局模块,当你导入一个新模块时,他会先查找sys.modules里有没有这个模块,如果没有再导入,如果有就在当前代码增加个引用。举个最简单的例子:

a.py

print("a模块加载")

def aa():
    print("a模块中的aa方法被加载")

b.py

import sys
a = sys.modules["a"]
a.aa()

c.py

import a
import b

先导入a模块,这样sys.modules已经有了a模块,你就可以使用sys.modules["a"]来使用a模块,它和import a基本是一样的。如果你先import b就会发现sys.modules不存在a

重新导入模块1

既然知道它是先查找sys.modules,那我在导入之前,先删除掉里面的a再导入就可以了

import a
import sys
del sys.modules["a"]
import a

这样就能重新加载模块

重新导入模块2

Python基础库也提供了一个方法重新加载模块:

import a
import importlib

importlib.reload(a)

看一下内部代码是怎么实现的:

逻辑也比较简单, 先看sys.modules里有没有这个模块,如果有就使用_bootstrap._exec导入模块。我们是不是也可以通过_bootstrap._exec来重新导入模块,可以但不建议,因为下划线开头的模块或者函数都是不建议外部使用的,这些接口可能在版本更新后变动比较频繁

无法热加载的情况

__main__模块无法热加载。当你执行python a.py,这个a.py文件是无法热加载的,它并没有作为模块导入,在sys.modules的名称就是__main__

如果你在__main__使用from a import A导入的类,即使a模块重新加载,__main__里面的A也不会改变

热加载无法影响已经实例化的对象,比如你修改了模块里面的类代码,但是已经在__main__里实例化了这个类对象,并且一直使用未释放,它的逻辑在热加载之后不会受影响。

函数级热加载

要想实现函数、方法乃至对象级别的热加载,得修改内存中的Python对象。有一个项目实现了这种,有兴趣的可以看:https://github.com/breuleux/jurigged

我的需求没有这么细,就不测试了

监听文件变化

我选择的是watchdog,另一个pyinotify不支持Windows。

watchdog在Windows上有点小bug,修改文件会触发两次事件。搜到一个解决方案:不使用默认的事件触发,而是利用文件快照,每隔一段时间做一次比对。原文链接:Python神器watchdog(监控文件变化),我测试了一下效果很好。

源码

完整的源码就不放了,具体可以看:https://github.com/kanadeblisst00/module_hot_loading

国内仓库:http://www.pygrower.cn:21180/kanadeblisst/module_hot_loading

安装

pip install module-hot-loading

使用
from threading import Event
from module_hot_loading import monitor_dir


if __name__ == "__main__":
    event = Event()
    event.set()
    path = "."
    monitor_dir(path, event, __file__, interval=2, only_import_exist=False)
    

monitor_dir的参数:

  1. 需要监控的目录路径
  2. 停止监控的事件信号
  3. __main__的代码文件路径
  4. interval: 每隔几秒打一次文件快照做比对
  5. only_import_exist: 只重新加载已经导入的模块
效果

最后,如果你是准备学习Python或者正在学习(想通过Python兼职),下面这些你应该能用得上:
包括:Python安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

在这里插入图片描述

Python模块热加载原理与实战:提升开发效率的四种实现方案 模块热加载是一种在不重启主程序的前提下,让代码修改即时生效的开发技术。其核心原理基于Python的模块系统与导入机制,通过重新编译和执行模块代码来更新运行时的逻辑定义。这项技术的价值在于显著提升开发迭代效率,尤其适用于Web后端服务、数据处理脚本、游戏服务器等需要长时间运行或对停机敏感的场景。在工程实践中,开发者常面临状态管理、依赖更新等挑战,需要结合文件监控、递归重载等策略来构建健壮的解决方案。本文深入解析了从基础监控到类状态迁移的四种实现路径,并探讨了如何在实际开发中应用热加载技术来优化工作流。 阅读详情

相关推荐

热加载技术:动态修改Python代码并实时查看结果

热加载技术是一种在运行时修改代码并实时查看结果的方法,它在开发过程中非常有用。当我们在开发Python应用程序时,经常需要不断地修改代码并测试结果。传统的开发方式是修改代码后重新运行程序,这样会浪费大量的时间。热加载技术可以显著提高开发效率,让我们能够即时地看到代码修改后的效果。在Python中,有几种热加载技术可供选择。本文将重点介绍两种常用的方法:使用importlib和使用第三方库pydevd。

CodeHeroicX的博客 915

Python 中的模块热加载(Hot Reload)

热加载是指在程序运行时动态替换和重新加载模块或代码,而不需要重新启动整个应用程序。这种技术可用于在不间断运行的情况下更新代码、应用变更和改进,提高开发效率,加快调试过程。

旦莫的博客 4140

python-47-flask应用代码热更新重新加载

热加载是指在程序运行时动态替换和重新加载模块或代码,而不需要重新启动整个应用程序。这种技术可用于在不间断运行的情况下更新代码、应用变更和改进,提高开发效率,加快调试过程。

qq_20466211的博客 1004

Python 代码热加载与动态修改的实现方式

代码热加载(Hot Reloading)是指在不重启整个应用程序的情况下,动态加载新的代码并应用到运行中的程序中。这种方式可以避免因频繁重启服务而导致的时间浪费,特别适用于需要快速验证代码变更的场景。Python 提供了多种实现代码热加载的方法,从标准库的imp和importlib到第三方工具如watchdog,开发者可以根据具体需求选择合适的方式。在实际项目中,建议结合文件监听和动态模块加载,以实现更加智能化的热加载机制。希望本文能为你的 Python 开发提供有价值的参考!```

2501_91245987的博客 422

二维码扫描与页面跳转的完整流程解析

本文详细解析了二维码扫描与页面跳转的完整流程,从核心原理到前后端实现,涵盖了二维码生成、扫码事件处理、后端验证机制及跳转逻辑等关键环节。特别介绍了如何使用qrcode.js生成二维码、WebSocket处理扫码状态以及JWT令牌验证设计,帮助开发者构建安全高效的扫码跳转系统。

cicd6pipeline的博客 1089

告别CNN局限:用Transformer+迁移学习搞定高光谱图像分类(附Pytorch代码)

本文探讨了如何利用Transformer的自注意力机制和迁移学习策略解决高光谱图像分类中的挑战。通过结合CNN的局部特征提取和Transformer的全局建模能力,提出的DenseTransformer架构在多个数据集上实现了显著的性能提升。文章还提供了详细的PyTorch实现代码和工程优化技巧,帮助开发者快速应用这一技术。

weixin_32771907的博客 607

Python模块热加载原理与实现:提升开发效率的watchdog+importlib方案

在软件开发中,模块化设计和动态加载是提升代码复用性和维护性的基础理念。其核心原理在于运行时动态替换或更新代码模块,而无需重启整个应用进程。这项技术的核心价值在于极大缩短开发调试的反馈循环,尤其适用于需要长时间运行或状态复杂的应用场景。通过文件系统监控检测变更,结合Python的模块导入机制实现安全重载,能够广泛应用于Web后端开发、数据分析脚本调试、游戏逻辑编写等需要快速迭代的领域。本文深入探讨了基于watchdog库和importlib.reload()的热加载实现方案,并分析了类实例更新等高级策略,为P

weixin_30702441的博客 339

Buck的振铃实验与分析

上上期我们提到了buck电路的开关的振铃波形,本质原因是LC的阻尼振荡。文章偏理论,那BUCK到底是怎么产生尖峰振荡呢? 要想把这个问题搞清楚,也很是不容易,所以文章有点长,请直接点赞转发加收藏。 问题 本期主要分析以下这两个问题: 1、死区时间是什么?这里有个小台阶是什么情况? 2、上下尖峰振荡是如何产生的?跟哪些因素有关? 理想的BUCK的SW波形 我们由浅入深,一步一步来,先看理想的开关SW波形—没有尖峰电压的波形。 为了能更好的看buck电路各个点的电压电流情况.

weixin_42005993的博客 3万+

简单实现热加载python交互模式(利用文件修改时间 和 python模块重载)

最近写公司 项目的时候碰到一个问题,公司使用flask,在自测单个模块下的函数会用到flask自带的shell调试,但是这个shell有一个问题就是无发热加载,每次修改了文件,就要退出重新进入,然后在输入from ..... import .... 然后开始执行函数,效率极其低下,还让人有点恼火,所以我就想写一个可以热加载的shell,提高一下效率,因为时间比较短,所以比较简陋,不过目前能满足我的...

阿友的专栏 1600

百条网络工程师基础面试题(不断更新)

1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。 3)什么是骨干网? 骨干网络是集中的基础设施,旨在将不同的路由和数据分发到各种网络。它还处理带宽管理和各种通道。 4)什么是 LAN? LAN 是局域网的缩写。它是指计算机与位于小物理位置的其他网络设备之间的连接。 5)什么是节点? 节点是指连接发生的点。它可以是作为网络一部分的计算机

weixin_42728126的博客 2万+

不提交也不释放的事务,数据库连接还有可能被复用

摘要 实验发现Spring事务管理下,未提交事务的数据库连接池连接仍可被复用,这与传统认知相悖。通过配置HikariCP连接池(最大2连接)并设计测试接口,观察到未提交事务的连接会被后续请求复用。这可能导致GTID错误(当MySQL开启GTID且混用事务/非事务表时)以及数据修改丢失问题。研究揭示了Spring事务管理机制与连接池交互的特殊行为,对高并发系统设计具有重要启示。

蔡定努 177

Python运行时模块热加载与即时调用

需要将存储读取json文件的中的代码(code)和数据(input),将input传参给code中optimize函数。考虑运行时模块热加载(runtime module hot-loading)与即时调用的机制,其核心是一种**动态代码注入(dynamic code injection)与反射式执行(reflective execution)**流程。涉及tempfiletextwrapimportlibinspect四个模块,一下对其进行介绍。

博客简介 1246

机器人学(三):手眼标定

主要讲了eye-to-hand的手眼标定求解算法,包括AX=XB和AX=YB两种情况,包含SVD法、Tsai-Lenz法、最小二乘法等,从原理到解法再到算法代码实现,包括matlab代码、C++代码、库的使用等,简单明了,容易在实际项目中进行应用

行者无疆的博客 2554

软件开发中的代码热加载技术:在运行时动态加载和替换代码模块的策略与实现

代码热加载是指在不重启应用程序的情况下,动态地更新代码并立即应用更改的技术。传统开发流程中,每次修改代码后都需要手动停止并重新启动应用,这一过程不仅耗时,还会打断开发者的思路。而通过热加载技术,开发者可以实时看到代码更改后的效果,显著提升开发效率。

jie_kou的博客 1141

(BS ISO 11898-1:2015)CAN_FD 总线协议详解1- 基本概念描述

本文对can总线协议做了详细的讲解,can协议里面的每一个知识点都做了详细且举一反三的论述,读了本文可以不用读can协议了。

zhangziranzm的博客 2314

SAP-ABAP:SAP库存管理核心增强:IF_EX_MB_DOCUMENT_BADI 深度解析

SAP库存管理核心增强:IF_EX_MB_DOCUMENT_BADI 深度解析

baidu_35680696的博客 1447

AI Agent技能系统:模块化设计与Python实现指南

在AI Agent开发中,模块化与工程化是提升系统可维护性和扩展性的关键。技能系统作为一种工程化框架,通过定义标准接口和注册机制,将Agent的各类功能封装为可复用的技能模块。其核心原理在于解耦Agent的规划逻辑与具体执行能力,通过Skill、BaseSkill和SkillRegistry等组件实现统一管理。这种设计显著提升了开发效率,使得功能扩展、动态组合和团队协作更加便捷。在实际应用中,技能系统广泛应用于智能助手、自动化工作流、数据分析等场景,是构建复杂AI Agent的基础设施。本文以Python代

weixin_30596165的博客 446

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: Python爬虫入门--urllib和urllib2!
下一篇: 超详细Python+Pycharm保姆级安装教程,Python环境配置和使用指南,看这一篇就足够了!
Python_trys
博客等级 码龄2年 4370粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值