(十一)ESP-VISION代码怎么组织、分发、更新?软件包管理完全指南
2026/7/20 12:16:01 网站建设 项目流程

ESP-VISION代码怎么组织、分发、更新?软件包管理完全指南

文章目录

  • ESP-VISION代码怎么组织、分发、更新?软件包管理完全指南
    • 一、写在前面:你写的代码放在哪
    • 二、三种部署方式对比
    • 三、文件系统结构
      • 3.1 导入优先级
      • 3.2 SD卡路径
    • 四、软件包组织
      • 4.1 模块与软件包结构
      • 4.2 用mpremote管理文件
      • 4.3 用mpremote mip安装软件包
    • 五、冻结到固件
      • 5.1 开发板manifest
      • 5.2 冻结自定义包
      • 5.3 重新构建
    • 六、部署策略选择
      • 推荐组合
    • 七、package.json vs manifest.py
    • 八、一个产品部署模板
    • 参考链接
    • 总结与下篇预告

一、写在前面:你写的代码放在哪

在桌面Python上,你写代码、pip install依赖、跑起来,从不关心代码放在哪。但ESP-VISION不一样——你的代码可能放在Flash里、SD卡里、甚至直接编译进固件里。放哪决定了启动速度、更新方式和内存占用。

今天这篇文章,把ESP-VISION的软件包管理讲透。

二、三种部署方式对比

开发阶段

半成品

产品发布

你的Python代码

部署方式

/lib 下的 .py 文件
可编辑,易更新

/lib 下的 .mpy 文件
预编译,加载快

冻结到固件
最快,不可篡改

属性/lib 下的 .py/lib 下的 .mpy冻结到固件
存储位置可写文件系统可写文件系统固件Flash镜像
导入行为导入时编译无需编译,直接加载直接执行冻结字节码
运行时RAM字节码+对象占RAM字节码+对象占RAM常量可保留在Flash
更新方式替换文件或mpremote替换兼容的.mpy文件重新构建烧录固件
主要用途开发+频繁更新导入开销低+可替换稳定产品依赖+启动模块

三、文件系统结构

ESP-VISION将内部Flash文件系统挂载到/,并将/lib加入sys.path

/ # 内部Flash文件系统根目录 ├── boot.py # 启动脚本(先于main.py执行) ├── main.py # 应用入口 ├── README.txt # 默认说明文件 ├── lib/ # 第三方库(sys.path已包含) │ ├── my_vision/ # 你的视觉库 │ │ ├── __init__.py │ │ ├── pipeline.py │ │ └── transport.py │ └── asyncio/ # 冻结的asyncio ├── sdcard/ # SD卡(需手动挂载) │ ├── models/ # AI模型文件 │ └── data/ # 数据文件 └── flash/ # Flash存储

3.1 导入优先级

当前目录 → 冻结模块(.frozen) → /lib

重要:同名文件系统软件包不能覆盖冻结软件包。如果你在/lib放了一个和冻结包同名的包,导入的仍然是冻结版本。

3.2 SD卡路径

SD卡挂载到/sdcard,但不会自动加入sys.path

importsys sys.path.append("/sdcard/lib")frommy_vision.pipelineimportVisionPipeline

四、软件包组织

4.1 模块与软件包结构

# 标准Python包结构my_vision/__init__.py pipeline.py transport.py# 导入frommy_vision.pipelineimportVisionPipeline pipeline=VisionPipeline()

4.2 用mpremote管理文件

# 列出开发板上的文件mpremote connect /dev/ttyACM0ls/# 上传文件mpremote connect /dev/ttyACM0cpmy_script.py :/main.py# 上传整个目录mpremote connect /dev/ttyACM0cp-rmy_vision/ :/lib/my_vision/# 下载文件mpremote connect /dev/ttyACM0cp:/main.py ./backup_main.py# 删除文件mpremote connect /dev/ttyACM0rm/main.py

4.3 用mpremote mip安装软件包

# 安装MicroPython软件包到/libmpremote connect /dev/ttyACM0 mipinstall--target=/lib<PACKAGE># 安装特定版本mpremote connect /dev/ttyACM0 mipinstall--target=/lib<PACKAGE>@<VERSION># 从package.json安装mpremote connect /dev/ttyACM0 mipinstall--target=/lib ./package.json

⚠️注意:ESP-VISION默认固件不支持设备端mipimport mip会报ImportError)。必须通过主机端mpremote安装。

五、冻结到固件

对于稳定的产品依赖和启动模块,应该冻结到固件中:

5.1 开发板manifest

ESP-VISION将开发板manifest保存在boards/<BOARD>/manifest.py

5.2 冻结自定义包

# 在boards/<BOARD>/manifest.py中添加package("my_vision",base_path="$(ESP_VISION_ROOT)/boards/<BOARD>/packages",)

文件夹结构:

boards/<BOARD>/packages/my_vision/ __init__.py pipeline.py transport.py

5.3 重新构建

# 修改manifest后需要重新配置和构建idf.py--board<BOARD>reconfigure idf.py--board<BOARD>build idf.py--board<BOARD>flash

六、部署策略选择

频繁修改

偶尔更新

几乎不变

代码更新频率?

/lib下的.py文件
mpremote cp更新

/lib下的.mpy文件
预编译后替换

冻结到固件
跟随固件更新

推荐组合

代码类型部署方式理由
启动模块(boot.py/main.py)冻结到固件稳定、启动快
框架扩展(视觉库)冻结到固件稳定依赖
产品脚本冻结到固件或/lib取决于更新频率
配置文件/lib需要现场修改
AI模型SD卡 / Flash体积大,独立更新
图像/视频资源SD卡体积大

七、package.json vs manifest.py

很多人搞混这两个文件:

文件用途阶段
package.jsonmip安装时描述文件和依赖运行时/设备预配置
manifest.py固件构建时嵌入模块构建时

两者不能相互替代。package.json用于mip,manifest.py用于固件冻结。

八、一个产品部署模板

# boards/<BOARD>/manifest.py# 冻结产品核心模块# 框架依赖freeze("$(MPY_DIR)/tools",opt=3)# 自定义视觉库package("my_vision",base_path="$(ESP_VISION_ROOT)/boards/<BOARD>/packages")# 产品启动脚本freeze("$(ESP_VISION_ROOT)/boards/<BOARD>/packages/main.py")
# 部署流程# 1. 构建固件(包含冻结模块)idf.py--boardESP32_P4X_EYE build# 2. 烧录固件idf.py--boardESP32_P4X_EYE-p/dev/ttyACM0 flash# 3. 上传配置文件mpremote connect /dev/ttyACM0cpconfig.json :/config.json# 4. 上传AI模型到SD卡# (手动拷贝到SD卡)

参考链接

  • ESP-VISION 软件包与部署
  • MicroPython 软件包管理
  • MicroPython manifest文档

总结与下篇预告

软件包管理的核心决策:频繁改的放/lib,稳定依赖冻结到固件,大文件放SD卡。别混淆package.json和manifest.py——前者给mip用,后者给固件构建用。

下篇是本系列的最后一篇——启动流程与架构全景。从按下复位键到你的main.py开始执行,中间发生了什么?ESP-VISION的分层架构又是怎么设计的?一篇文章讲清楚。


作者:码农阿虎

关键词:软件包管理、mpremote、mip、固件冻结、manifest


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询