ESP32如何通过uPyPI在线动态安装库及自动处理依赖?

摘要:做 MicroPython 嵌入式开发的你,是不是每天都在被这些问题折磨?写好的代码一运行就报错,翻遍半天发现​少装了一个依赖文件​;更崩溃的是,一个库要带好几个附属文件,漏一个就全盘报废。
引言 做 MicroPython 嵌入式开发的你,是不是每天都在被这些问题折磨? 写好的代码一运行就报错,翻遍半天发现​少装了一个依赖文件​;更崩溃的是,一个库要带好几个附属文件,漏一个就全盘报废。 这里,我们需要先引出依赖库的概念,在 MicroPython 开发中,依赖库的官方定义非常清晰: 你的主功能代码 / 主库,无法独立正常运行,必须调用其他独立的 .py 代码文件提供的​函数、类、硬件接口、算法逻辑​,这些被调用的外部代码文件,就是​依赖库​。 举一个嵌入式真实案例:用 ESP32 驱动 MAX30102 传感器,做心率血氧检测 主功能文件:heart_rate.py(负责:心率计算、数据显示、异常报警) 依赖库文件 1:max30102.py(负责:传感器底层硬件读写、寄存器配置) 依赖库文件 2:filter_lib.py(负责:波形滤波、噪声消除算法) 心率主程序 → 必须调用 传感器驱动 + 滤波算法 才能运行没有这两个依赖库,你的心率代码直接报错,完全跑不起来。 再延伸一个真实开发场景: 你安装的某个 WiFi联网某某功能库,可能依赖 网络协议库; 网络协议库,又依赖 数据加密库。 疑问 小白灵魂拷问:我为什么不能把所有代码复制粘贴,揉进一个 .py 文件里? 这是 99% 的新手都会踩的坑,我结合​嵌入式开发实际工作​,告诉你绝对不能这么做的 4 个核心原因: 依赖库会​版本升级​,合并后彻底无法更新 max30102.py 驱动:作者会修复 bug、优化读取精度、升级硬件适配 filter_lib.py 算法:作者会优化滤波效果,降低误差 如果你把所有代码合并成一个文件: 每次依赖库升级,你都要把整个大文件重写一遍,极易改错、删错代码;而​分离成独立依赖库​,只需要升级单个文件,主代码完全不用动。 依赖库是​通用工具​,可以复用到无数项目 max30102 驱动:不仅能做心率,还能做血氧、手势检测 滤波算法库:不仅能给心率用,还能给温湿度、气压传感器用 合并成一个文件后,代码彻底「锁死」在心率项目里,无法复用; 独立依赖库,所有项目直接调用,一次编写,无数次使用。 嵌套依赖会让代码彻底失控 一个心率功能,可能依赖 2 个库;这 2 个库,又各自依赖 2 个底层库;最终依赖关系会变成:主代码 → 4 个依赖库。如果全部合并成一个文件,代码会达到​几千行、几万行​,报错了根本找不到问题在哪。 开发维护成本爆炸 嵌入式开发大多是多人协作:A 工程师写传感器驱动,B 工程师写算法,C 工程师写主功能。代码分开(依赖库模式),大家互不干扰;合并成一个文件,所有人改同一个文件,直接冲突、代码报废。 这就是为什么,我们必须给 ESP32 实现: 类 Python pip 的 在线自动安装 + 依赖自动加载:一行代码,自动装主库 + 所有依赖库 + 嵌套依赖,自动处理版本升级! 核心方案:uPyPi + mip 我们做的 uPyPi,就是 MicroPython 生态的​PyPI(Python 官方包仓库)​,配合 MicroPython 官方内置的 mip(mip installs packages)工具,实现: ✅ ​包托管​:驱动包、工具包一键上传到 uPyPi,全球开发者可访问 ✅ ​一键安装​:开发板连网,一行代码安装主包 + 所有依赖 ✅ ​依赖自动管理​:mip 自动递归安装声明的依赖包,无需手动操作 ✅ ​全芯片兼容​:纯软件包设计,支持所有 MicroPython 开发板,无硬件耦合 ✅ ​版本管理​:语义化版本控制,彻底避免版本冲突 从零实操:3 步实现 ESP32 动态安装依赖 关于如何下载上传驱动包可看wiki: https://freakstudio.cn/node/019c992e-2994-7180-b570-12199db1a7cb 第一步:制作第三方依赖包 math_utils 这是一个纯软件工具包,无任何硬件代码,作为主包的依赖。
阅读全文