ESP32 实现在线动态安装库和自动依赖安装-使用uPyPI包管理平台

你的主功能代码 / 主库,无法独立正常运行,必须调用其他独立的 .py 代码文件提供的​函数、类、硬件接口、算法逻辑 ​,这些被调用的外部代码文件,就是​依赖库​。

举一个嵌入式真实案例:用 ESP32 驱动 MAX30102 传感器,做心率血氧检测

  • 主功能文件:heart_rate.py(负责:心率计算、数据显示、异常报警)
  • 依赖库文件 1:max30102.py(负责:传感器底层硬件读写、寄存器配置)
  • 依赖库文件 2:filter_lib.py(负责:波形滤波、噪声消除算法)

心率主程序 → 必须调用 传感器驱动 + 滤波算法 才能运行没有这两个依赖库,你的心率代码直接报错,完全跑不起来。

再延伸一个真实开发场景:

  • 你安装的某个 WiFi联网某某功能库,可能依赖 网络协议库
  • 网络协议库,又依赖 数据加密库

疑问

小白灵魂拷问:我为什么不能把所有代码复制粘贴,揉进一个 .py 文件里?

这是 99% 的新手都会踩的坑,我结合​嵌入式开发实际工作​,告诉你绝对不能这么做的 4 个核心原因:

  1. 依赖库会版本升级,合并后彻底无法更新
  • max30102.py 驱动:作者会修复 bug、优化读取精度、升级硬件适配
  • filter_lib.py 算法:作者会优化滤波效果,降低误差
  • 如果你把所有代码合并成一个文件:
    每次依赖库升级,你都要把整个大文件重写一遍,极易改错、删错代码;而分离成独立依赖库,只需要升级单个文件,主代码完全不用动。
  1. 依赖库是通用工具,可以复用到无数项目
  • max30102 驱动:不仅能做心率,还能做血氧、手势检测
  • 滤波算法库:不仅能给心率用,还能给温湿度、气压传感器用
  • 合并成一个文件后,代码彻底「锁死」在心率项目里,无法复用;
    独立依赖库,所有项目直接调用,一次编写,无数次使用。
  1. 嵌套依赖会让代码彻底失控

一个心率功能,可能依赖 2 个库;这 2 个库,又各自依赖 2 个底层库;最终依赖关系会变成:主代码 → 4 个依赖库。如果全部合并成一个文件,代码会达到​几千行、几万行​,报错了根本找不到问题在哪。

  1. 开发维护成本爆炸

嵌入式开发大多是多人协作:A 工程师写传感器驱动,B 工程师写算法,C 工程师写主功能。代码分开(依赖库模式),大家互不干扰;合并成一个文件,所有人改同一个文件,直接冲突、代码报废。

这就是为什么,我们必须给 ESP32 实现:
类 Python pip 的 在线自动安装 + 依赖自动加载:一行代码,自动装主库 + 所有依赖库 + 嵌套依赖,自动处理版本升级!

核心方案:uPyPi + mip

我们做的 uPyPi,就是 MicroPython 生态的​PyPI(Python 官方包仓库) ​,配合 MicroPython 官方内置的 mipmip installs packages)工具,实现:

  • 包托管:驱动包、工具包一键上传到 uPyPi,全球开发者可访问
  • 一键安装:开发板连网,一行代码安装主包 + 所有依赖
  • 依赖自动管理mip 自动递归安装声明的依赖包,无需手动操作
  • 全芯片兼容:纯软件包设计,支持所有 MicroPython 开发板,无硬件耦合
  • 版本管理:语义化版本控制,彻底避免版本冲突

从零实操:3 步实现 ESP32 动态安装依赖

关于如何下载上传驱动包可看wiki: https://freakstudio.cn/node/019c992e-2994-7180-b570-12199db1a7cb

第一步:制作第三方依赖包 math_utils

这是一个纯软件工具包,无任何硬件代码,作为主包的依赖。

文件夹结构如下:

code/math_utils.py代码如下:

package.json 完整配置为:

复制代码

|---|------------------------------------------|
| | { |
| | "name": "math_utils", |
| | "version": "1.0.1", |
| | "description": "纯第三方软件依赖包(无硬件,测试用)", |
| | "author": "test", |
| | "license": "MIT", |
| | "chips": "all", |
| | "fw": "all", |
| | "_comments": { |
| | "chips": "该包支持运行的芯片型号,all表示无芯片限制", |
| | "fw": "该包依赖的特定固件如ulab、lvgl,all表示无固件依赖" |
| | }, |
| | "urls": [ |
| | [ |
| | "math_utils.py", |
| | "code/math_utils.py" |
| | ] |
| | ] |
| | } |

打包文件夹,上传到 uPyPi 平台,获取包地址:

第二步:制作主测试包 test_core

主包依赖上面的 math_utils,用户只需要安装主包,mip 自动安装依赖。

文件夹结构:

code/test_core.py 代码如下:

package.json 完整配置为:

复制代码

|---|---------------------------------------------------------|
| | "name": "test_core", |
| | "version": "1.0.4", |
| | "description": "纯软件测试主包(无硬件,依赖第三方包)", |
| | "author": "test", |
| | "license": "MIT", |
| | "chips": "all", |
| | "fw": "all", |
| | "_comments": { |
| | "chips": "该包支持运行的芯片型号,all表示无芯片限制", |
| | "fw": "该包依赖的特定固件如ulab、lvgl,all表示无固件依赖" |
| | }, |
| | "urls": [ |
| | [ |
| | "test_core.py", |
| | "code/test_core.py" |
| | ] |
| | ], |
| | "deps": [ |
| | ["https://upypi.net/pkgs/math_utils/1.0.1", "latest"] |
| | ] |
| | } |

这里,我们在deps字段声明主包依赖 math_utils 的 uPyPi 地址,mip 安装主包时,​自动递归安装依赖包​,用户完全不用管;`支持多个依赖,可嵌套依赖,mip自动处理所有依赖链。

打包文件夹,上传到 uPyPi 平台,获取主包地址:

第三步:ESP32 一键安装 + 测试

ESP32 完整代码如下:

复制代码

|---|--------------------------------------------------------------------|
| | # ==================== ESP32 纯软件测试(无硬件、无耦合) ==================== |
| | import time |
| | import network |
| | import mip |
| | |
| | # ==================== 配置 ==================== |
| | WIFI_SSID = "808" |
| | WIFI_PASSWORD = "88888888" |
| | # uPyPi 主测试包地址(替换成upypi的地址) |
| | MAIN_PACKAGE = "https://upypi.net/pkgs/test_core/1.0.4" |
| | |
| | # ==================== 连接WiFi ==================== |
| | def connect(): |
| | wlan = network.WLAN(network.STA_IF) |
| | wlan.active(True) |
| | print("连接WiFi...") |
| | wlan.connect(WIFI_SSID, WIFI_PASSWORD) |
| | for _ in range(10): |
| | if wlan.isconnected(): |
| | print("WiFi 连接成功!IP:", wlan.ifconfig()[0]) |
| | return True |
| | time.sleep(1) |
| | print("WiFi 连接失败") |
| | return False |
| | |
| | # ==================== 远程安装(自动装第三方软件依赖) ==================== |
| | def install(): |
| | print("开始安装:主包 + 第三方纯软件依赖...") |
| | mip.install(MAIN_PACKAGE) |
| | print("✅ 安装完成!无任何硬件依赖") |
| | |
| | # ==================== 纯软件测试(无硬件) ==================== |
| | def test(): |
| | # 导入安装好的纯软件包 |
| | from test_core import TestCore |
| | test = TestCore() |
| | |
| | # 运行测试 |
| | print("\n===== 纯软件测试结果 =====") |
| | print(test.test_add(10, 20)) |
| | print(test.test_multiply(10, 20)) |
| | print("=========================\n") |
| | print("🎉 测试成功!依赖安装正常") |
| | |
| | # ==================== 主程序 ==================== |
| | if __name__ == "__main__": |
| | if connect(): |
| | install() |
| | test() |

运行结果如下:

相关推荐
皮皮哎哟5 小时前
ARM驱动基础(基于正点原子IMX6ULL Mini)
arm开发·linux内核·imx6ull·nxp·正点原子、·imx6u mini
somi75 小时前
ARM-驱动-03 Linux 字符设备驱动开发
linux·arm开发·驱动开发·自用
somi75 小时前
ARM-驱动-01Linux系统移植
arm开发
somi76 小时前
ARM-04-驱动-Misc ,Platform ,DTS
arm开发·单片机·嵌入式硬件·自用
fenglllle19 小时前
使用AI能力编译ARM版本的截图软件
arm开发·人工智能
somi72 天前
ARM-驱动-02-Linux 内核开发环境搭建与编译
linux·运维·arm开发
XINVRY-FPGA2 天前
XC7VX690T-2FFG1157I Xilinx AMD Virtex-7 FPGA
arm开发·人工智能·嵌入式硬件·深度学习·fpga开发·硬件工程·fpga
cpp_learners2 天前
Linux ARM架构 使用 linuxdeployqt 打包QT程序
linux·arm开发·qt
森G2 天前
3.1、移植Qt程序到ARM平台----移植Qt程序到ARM平台(扩展)
arm开发·c++·qt