行业资讯
📅 2026/7/20 12:16:02
(十一)ESP-VISION代码怎么组织、分发、更新?软件包管理完全指南
ESP-VISION代码怎么组织、分发、更新软件包管理完全指南文章目录ESP-VISION代码怎么组织、分发、更新软件包管理完全指南一、写在前面你写的代码放在哪二、三种部署方式对比三、文件系统结构3.1 导入优先级3.2 SD卡路径四、软件包组织4.1 模块与软件包结构4.2 用mpremote管理文件4.3 用mpremote mip安装软件包五、冻结到固件5.1 开发板manifest5.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.pathimportsys sys.path.append(/sdcard/lib)frommy_vision.pipelineimportVisionPipeline四、软件包组织4.1 模块与软件包结构# 标准Python包结构my_vision/__init__.py pipeline.py transport.py# 导入frommy_vision.pipelineimportVisionPipeline pipelineVisionPipeline()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.py4.3 用mpremote mip安装软件包# 安装MicroPython软件包到/libmpremote connect /dev/ttyACM0 mipinstall--target/libPACKAGE# 安装特定版本mpremote connect /dev/ttyACM0 mipinstall--target/libPACKAGEVERSION# 从package.json安装mpremote connect /dev/ttyACM0 mipinstall--target/lib ./package.json⚠️注意ESP-VISION默认固件不支持设备端mipimport mip会报ImportError。必须通过主机端mpremote安装。五、冻结到固件对于稳定的产品依赖和启动模块应该冻结到固件中5.1 开发板manifestESP-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.py5.3 重新构建# 修改manifest后需要重新配置和构建idf.py--boardBOARDreconfigure idf.py--boardBOARDbuild idf.py--boardBOARDflash六、部署策略选择频繁修改偶尔更新几乎不变代码更新频率/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用于mipmanifest.py用于固件冻结。八、一个产品部署模板# boards/BOARD/manifest.py# 冻结产品核心模块# 框架依赖freeze($(MPY_DIR)/tools,opt3)# 自定义视觉库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