mpy-cli 是一个面向 MicroPython 的交互式部署工具,用于将本地代码上传到 MicroPython 端。
支持能力:
- 增量部署(基于
git diff文件集,仅上传修改部分) - 全量部署(清空设备文件根目录后重刷)
.mpyignore忽略规则,类似.gitignore- 萌新以及跨平台友好的交互式命令行操作
如果你是第一次使用本项目,可以遵循以下步骤。
- Python 版本:
>= 3.10(推荐3.11) - 已安装
uv或pip - 已安装 Git
- 开发机可访问 MicroPython 设备串口
推荐使用 uv:
uv tool install mpy-cli使用传统 pip 时,先在目标项目中创建并激活虚拟环境。
macOS / Linux:
cd <TARGET_PROJECT_PATH>
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install mpy-cliWindows PowerShell:
cd <TARGET_PROJECT_PATH>
py -m venv .venv
.venv\Scripts\Activate.ps1
py -m pip install mpy-clicd <TARGET_PROJECT_PATH>
mpy-cli initinit 会进入交互式配置向导(可扫描设备端口并选择),无需手动编辑配置文件。
在 plan/deploy 交互模式下,如果未提供 --port,会自动扫描可用端口并提示选择。
初始化后会生成:
.mpy-cli.toml.mpyignore.mpy-cli/(运行目录)
详细参数参见CLI 参数总览
如果你后续想修改端口、同步模式、运行目录、设备上传目录等配置,直接执行:
mpy-cli config详细参数参见CLI 参数总览
如果你还不确定当前有哪些可连接的 MicroPython 设备,可以先执行:
mpy-cli list该命令会扫描串口并探测可访问的 MicroPython 设备,输出所有可用设备的端口与基础信息。
预览部署操作,防止程序产生意料之外的行为
mpy-cli plan详细参数参见CLI 参数总览
预览部署操作,防止程序产生意料之外的行为
mpy-cli deploy详细参数参见CLI 参数总览
如果后续想要进行无交互式的部署,可以执行
mpy-cli deploy --no-interactive --yes
可以通过 uv 或 pip 从 PyPI 安装。
使用 uv(推荐):
uv tool install mpy-cli使用 pip 时,先在目标项目中创建并激活虚拟环境。
macOS / Linux:
cd <TARGET_PROJECT_PATH>
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install mpy-cliWindows PowerShell:
cd <TARGET_PROJECT_PATH>
py -m venv .venv
.venv\Scripts\Activate.ps1
py -m pip install mpy-cli安装后可直接在该项目环境中使用:
mpy-cli -h
mpy-cli init
mpy-cli config
mpy-cli list
mpy-cli plan
mpy-cli deploy
mpy-cli upload
mpy-cli run
mpy-cli delete
mpy-cli tree
下面列出当前可用命令和参数,便于查阅。
mpy-cli init [-f] [--force] [-n] [--no-interactive]-f/--force:覆盖已有.mpy-cli.toml和.mpyignore。-n/--no-interactive:跳过初始化后的交互配置向导。
mpy-cli config- 无额外参数。
- 进入交互式配置向导,更新
.mpy-cli.toml。
常用配置项说明:
source_dir:本地源码根目录。plan/deploy计算远端路径时以该目录为根,不保留source_dir前缀。.mpyignore:规则匹配对象为“相对source_dir的路径”。- 当
source_dir = "src"时,本地src/main.py对应远端:main.py。 - 若历史
.mpyignore规则包含src/...前缀,需迁移为相对source_dir的写法。 device_upload_dir:设备端上传目录前缀,留空表示设备根目录。- 当
device_upload_dir = "apps/demo"时,本地main.py会上传到设备:apps/demo/main.py。 full模式会清空该上传目录,而不是整机设备根目录。compile_mpy:默认是否启用主机侧mpy-cross交叉编译上传,默认false。keep_py:当compile_mpy = true时,哪些相对source_dir的路径继续保留源码上传,使用逗号分隔在向导中填写。mpy_cross_binary:mpy-cross命令名,默认mpy-cross。mpy_emit_policy:默认最高 emitter 策略,支持bytecode、native、viper,默认bytecode;native会按native、bytecode顺序尝试,viper会按viper、native、bytecode顺序尝试。mpy_cross_arch:native/viper使用的目标架构,留空表示不传-march。
mpy-cli plan [-m {incremental,full}] [--mode {incremental,full}] [-b BASE] [--base BASE] [-p PORT] [--port PORT] [-c {on,off}] [--compile-mpy {on,off}] [-k PATH] [--keep-py PATH] [--emit-policy {bytecode,native,viper}] [--mpy-cross-arch ARCH] [-n] [--no-interactive] [-y] [--yes]-m/--mode:指定同步模式(incremental或full)。-b/--base:仅在incremental模式生效,指定 Git 基准提交;增量集合按“该基准提交 vs 当前工作区”计算。-p/--port:指定设备端口(如/dev/ttyACM0或COM3)。-c/--compile-mpy:设置本次是否启用主机侧mpy-cross交叉编译,取值on或off;不传时回退到配置文件中的compile_mpy。-k/--keep-py:声明本次继续保留源码上传的相对source_dir路径,可重复传入;只有在compile_mpy = on时生效。--emit-policy:设置本次mpy-cross默认最高 emitter 策略,取值bytecode、native或viper;不传时回退到配置文件中的mpy_emit_policy。--mpy-cross-arch:设置本次native/viper的-march目标架构;不传时回退到配置文件中的mpy_cross_arch。-n/--no-interactive:禁用交互提问。-y/--yes:保留参数;在plan中不会触发写入确认流程。
当开启 compile_mpy 后,plan 展示的是板端最终会出现的 .py / .mpy 文件以及兼容性清理动作,而不是本地源码原样列表。
mpy-cli list [-w N] [--workers N] [-t SECONDS] [--probe-timeout SECONDS] [-s MODE] [--scan-mode MODE] [-r] [--reset]-w/--workers:并发探测线程数,默认8;当扫描到很多端口时可提升返回速度。-t/--probe-timeout:单端口探测超时秒数,默认1.0;慢端口超时后会被跳过,不阻塞全部结果。-s/--scan-mode:端口探测策略,支持known-first、known-only、full-only,默认known-first。-r/--reset:先清空之前的扫描记录,再立即执行当前这次list。- 默认会先读取运行时数据库里“上一次扫描成功过”的端口,仅对“成功缓存端口与当前
mpremote connect list交集”做探测;若没有发现设备,再回退到当前可用端口全量探测。 - 该策略兼容 macOS / Linux / Windows:是否“当前可用”以本次
mpremote connect list结果为准,因此COM3这类 Windows 端口同样可用。 - 自动扫描串口,并对选中的端口进行受控并发探测,返回所有可访问的 MicroPython 设备。
- 若存在
.mpy-cli.toml,会优先使用其中的mpremote_binary配置;否则默认使用mpremote。
推荐用法:
mpy-cli list当本机串口很多、默认探测较慢时,可按需调高并发并缩短超时:
mpy-cli list -w 12 -t 1.0如果你想直接忽略缓存、每次都对当前端口全量探测:
mpy-cli list -s full-only如果你想先清空之前的扫描记录,再做一次全新的 list:
mpy-cli list -r输出会包含当前探测到的所有可用 MicroPython 设备,例如端口、实现版本、平台与机型信息。
mpy-cli deploy [-m {incremental,full}] [--mode {incremental,full}] [-b BASE] [--base BASE] [-p PORT] [--port PORT] [-c {on,off}] [--compile-mpy {on,off}] [-k PATH] [--keep-py PATH] [--emit-policy {bytecode,native,viper}] [--mpy-cross-arch ARCH] [-n] [--no-interactive] [-y] [--yes]-m/--mode:指定同步模式(incremental或full)。-b/--base:仅在incremental模式生效,指定 Git 基准提交;未提供时默认对比HEAD与当前工作区。-p/--port:指定设备端口。-c/--compile-mpy:设置本次是否启用主机侧mpy-cross交叉编译,取值on或off;不传时回退到配置文件中的compile_mpy。-k/--keep-py:声明本次继续保留源码上传的相对source_dir路径,可重复传入;只有在compile_mpy = on时生效。--emit-policy:设置本次mpy-cross默认最高 emitter 策略,取值bytecode、native或viper;不传时回退到配置文件中的mpy_emit_policy。--mpy-cross-arch:设置本次native/viper的-march目标架构;不传时回退到配置文件中的mpy_cross_arch。-n/--no-interactive:禁用交互提问。-y/--yes:跳过执行前确认(包括全量模式二次确认)。
当开启 compile_mpy 后,普通 Python 模块会先在主机侧通过 mpy-cross 转成 .mpy 再上传到板端;被 keep_py 命中的路径继续保留源码上传。native 策略会先尝试 native,失败后回退到普通编译;viper 策略会先尝试 viper,失败后依次回退到 native 和普通编译。源码中的 @micropython.native / @micropython.viper 由 mpy-cross 处理。整个过程不建立目录级缓存,只在单文件上传过程中短暂生成临时 .mpy 产物。
推荐用法:
mpy-cli deploy -n -y进行 config 之后直接无交互烧入
如果你希望只保留入口文件源码,其余模块交叉编译后上传:
mpy-cli deploy -c on -k main.py -n -y如果你希望优先尝试 viper / native,并在失败时自动回退到普通编译:
mpy-cli deploy -c on --emit-policy viper --mpy-cross-arch armv7emsp -n -ympy-cli upload [-l LOCAL] [--local LOCAL] [-r REMOTE] [--remote REMOTE] [-p PORT] [--port PORT] [-n] [--no-interactive] [-y] [--yes]-l/--local:本地文件路径(如seekfree_demo/E01_demo.py)。-r/--remote:设备目标路径;不传时交互模式默认优先使用“相对source_dir路径”,若本地文件不在source_dir下则回退为本地输入路径,可手动修改。-p/--port:指定设备端口。-n/--no-interactive:禁用交互提问;此时需显式提供--local和--remote。-y/--yes:跳过执行前确认。
推荐用法:
mpy-cli upload -l <LOCAL>填写字段 LOCAL 指定本地文件路径之后交互式确认远程路径
mpy-cli run [-f PATH] [--path PATH] [-p PORT] [--port PORT] [-n] [--no-interactive] [-y] [--yes]-f/--path:设备目标文件路径,语义为相对device_upload_dir。-p/--port:指定设备端口。-n/--no-interactive:禁用交互提问;此时需显式提供--path。-y/--yes:跳过执行前确认。
推荐用法:
mpy-cli run -f main.py若配置 device_upload_dir = "apps/demo",则会执行 :apps/demo/main.py。
mpy-cli delete [-f PATH] [--path PATH] [-p PORT] [--port PORT] [-n] [--no-interactive] [-y] [--yes]-f/--path:设备目标路径,语义为相对device_upload_dir,可为文件或目录。-p/--port:指定设备端口。-n/--no-interactive:禁用交互提问;此时需显式提供--path。-y/--yes:跳过执行前确认。
推荐用法:
mpy-cli delete -f obsolete.py若配置 device_upload_dir = "apps/demo",则会删除 :apps/demo/obsolete.py。
当 --path 指向目录时,默认递归删除整个目录。
mpy-cli tree [-a PATH] [--path PATH] [-p PORT] [--port PORT] [-n] [--no-interactive]-a/--path:设备目标目录路径,语义为相对device_upload_dir;不传时默认读取device_upload_dir根目录。-p/--port:指定设备端口。-n/--no-interactive:禁用交互提问;此时需通过--port或配置文件提供端口。
推荐用法:
mpy-cli tree -a .若配置 device_upload_dir = "apps/demo",则默认读取 :apps/demo;例如 --path services 会读取 :apps/demo/services。
uv pip install mpremote或:
python3 -m pip install mpremote- 检查串口号(如
/dev/ttyACM0、COM3) - 关闭占用串口的软件(如 Thonny)
先执行 mpy-cli plan ... 查看计划,再执行 deploy。
参见 Thonny 中的设备串口号(圆括号内的内容)。
搭配 stubs,例如在智能车竞赛中使用我的项目micropython-smartcar-stubs。
可以实现完全无 thonny 开发 MicroPython 项目。
开发与规范说明:docs/developer-guide.md
本仓库采用 GPL-3.0 协议开源。
如果你将本仓库代码或其中的部分实现用于竞赛、课程项目、科研展示或商业实践,并因此获得奖项、奖金或其他收益,欢迎开源你的相关代码、注明本项目来源,或通过 Star、Issue、PR 等方式参与社区共建。