mpy-cli
mpy-cli 是一个面向 MicroPython 的交互式部署工具,用于将本地代码上传到 MicroPython 端。
支持能力:
- 增量部署(基于
git diff文件集,仅上传修改部分) - 全量部署(清空设备文件根目录后重刷)
.mpyignore忽略规则,类似.gitignore- 萌新以及跨平台友好的交互式命令行操作
Quick Start
如果你是第一次使用本项目,可以遵循以下步骤。
阅读完本章之后,建议继续阅读 在其他项目中安装为命令行工具
0) 环境要求
- Python 版本:
>= 3.10(推荐3.11) - 已安装
uv(推荐) - 已安装 Git
- 开发机可访问 MicroPython 设备串口
可先检查工具版本:
uv --version
python3 --version
1) 克隆仓库
git clone https://github.com/LanternCX/mpy-cli.git
cd mpy-cli
2) 安装依赖
推荐使用 uv:
uv sync --extra dev
也可以使用 Python 自带虚拟环境:
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -e ".[dev]"
3) 运行测试
使用 uv:
uv run pytest -q
使用已激活的虚拟环境:
python3 -m pytest -q
4) 运行 LSP 检查
使用 uv:
uv run pyright
使用已激活的虚拟环境:
pyright
5) 初始化项目
使用 uv:
uv run mpy-cli init
init 会进入交互式配置向导(可扫描设备端口并选择),无需手动编辑配置文件。
如果已经激活 .venv,也可以直接使用 mpy-cli。
在 plan/deploy 交互模式下,如果未提供 --port,会自动扫描可用端口并提示选择。
初始化后会生成:
.mpy-cli.toml.mpyignore.mpy-cli/(运行目录)
详细参数参见CLI 参数总览
6) 后续重配(可选)
如果你后续想修改端口、同步模式、运行目录、设备上传目录等配置,直接执行:
mpy-cli config
详细参数参见CLI 参数总览
7) 计划部署
如果你还不确定当前有哪些可连接的 MicroPython 设备,可以先执行:
mpy-cli list
该命令会扫描串口并探测可访问的 MicroPython 设备,输出所有可用设备的端口与基础信息。
预览部署操作,防止程序产生意料之外的行为
mpy-cli plan
详细参数参见CLI 参数总览
8) 部署到 MicroPython 端
预览部署操作,防止程序产生意料之外的行为
mpy-cli deploy
详细参数参见CLI 参数总览
如果后续想要进行无交互式的部署,可以执行
mpy-cli deploy --no-interactive --yes
在其他项目中安装为命令行工具
推荐直接从 PyPI 安装:
python3 -m pip install mpy-cli
也可以使用 uv 安装为独立命令行工具:
uv tool install mpy-cli
从源码安装时,推荐使用目标项目自己的虚拟环境:
TARGET_PROJECT_PATH: 你要安装并使用 mpy-cli 的目标项目目录SOURCE_MPY_CLI_PATH: 本地 mpy-cli 源码仓库路径(作为安装源)
cd <TARGET_PROJECT_PATH>
uv venv
source .venv/bin/activate
# 从源码安装 mpy-cli
uv pip install <SOURCE_MPY_CLI_PATH>
也可以使用 Python 自带虚拟环境:
cd <TARGET_PROJECT_PATH>
python3 -m venv .venv
source .venv/bin/activate
# 从源码安装 mpy-cli
python3 -m pip install <SOURCE_MPY_CLI_PATH>
安装后可直接在该项目环境中使用:
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代码改动后立即生效,可改用可编辑安装:
uv pip install -e <SOURCE_MPY_CLI_PATH>
或:
python3 -m pip install -e <SOURCE_MPY_CLI_PATH>
CLI 参数总览
下面列出当前可用命令和参数,便于查阅。
mpy-cli init
mpy-cli init [-f] [--force] [-n] [--no-interactive]
-f/--force:覆盖已有.mpy-cli.toml和.mpyignore。-n/--no-interactive:跳过初始化后的交互配置向导。
mpy-cli config
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
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
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
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 -y
mpy-cli upload
mpy-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
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
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
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。
常见问题
1) mpremote 找不到
uv pip install mpremote
或:
python3 -m pip install mpremote
2) 串口连接失败或者烧录报错
- 检查串口号(如
/dev/ttyACM0、COM3) - 关闭占用串口的软件(如 Thonny)
3) 我不确定会同步哪些文件
先执行 mpy-cli plan ... 查看计划,再执行 deploy。
4) 我不知道串口号
参见 Thonny 中的设备串口号(圆括号内的内容)。
5) 为什么选择 mpy-cli?
搭配 stubs,例如在智能车竞赛中使用我的项目micropython-smartcar-stubs。
可以实现完全无 thonny 开发 MicroPython 项目。
Contribute
开发与规范说明:docs/developer-guide.md
本仓库采用 GPL-3.0 协议开源。
如果你将本仓库代码或其中的部分实现用于竞赛、课程项目、科研展示或商业实践,并因此获得奖项、奖金或其他收益,欢迎开源你的相关代码、注明本项目来源,或通过 Star、Issue、PR 等方式参与社区共建。
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mpy_cli-2.0.0.tar.gz.
File metadata
- Download URL: mpy_cli-2.0.0.tar.gz
- Upload date:
- Size: 69.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5424a4d04c79dbd362d6be8431292ed7ed0b1d27474edcf3bb3aca9e153e1e86
|
|
| MD5 |
fb3b31e40265741e104cfb6ed42af22b
|
|
| BLAKE2b-256 |
87daecbd3ffe8e4a10b5148c92cf19444d394670f96ecfe09020658fa22968fe
|
Provenance
The following attestation bundles were made for mpy_cli-2.0.0.tar.gz:
Publisher:
publish.yml on LanternCX/mpy-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mpy_cli-2.0.0.tar.gz -
Subject digest:
5424a4d04c79dbd362d6be8431292ed7ed0b1d27474edcf3bb3aca9e153e1e86 - Sigstore transparency entry: 2408633689
- Sigstore integration time:
-
Permalink:
LanternCX/mpy-cli@742649908af93a1f7270159b84dd7bedd51e5cbe -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/LanternCX
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@742649908af93a1f7270159b84dd7bedd51e5cbe -
Trigger Event:
release
-
Statement type:
File details
Details for the file mpy_cli-2.0.0-py3-none-any.whl.
File metadata
- Download URL: mpy_cli-2.0.0-py3-none-any.whl
- Upload date:
- Size: 50.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f0cd971eb867679300d85ef1fca59379e08c62b8f793bac74ae9125e9c08d22
|
|
| MD5 |
5ff9b17a7a890f98a1d926c941194033
|
|
| BLAKE2b-256 |
19aaaf67b83e8e155d663f8eb1589d943017dcf176d27d716fc92fd919e8e746
|
Provenance
The following attestation bundles were made for mpy_cli-2.0.0-py3-none-any.whl:
Publisher:
publish.yml on LanternCX/mpy-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mpy_cli-2.0.0-py3-none-any.whl -
Subject digest:
9f0cd971eb867679300d85ef1fca59379e08c62b8f793bac74ae9125e9c08d22 - Sigstore transparency entry: 2408634010
- Sigstore integration time:
-
Permalink:
LanternCX/mpy-cli@742649908af93a1f7270159b84dd7bedd51e5cbe -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/LanternCX
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@742649908af93a1f7270159b84dd7bedd51e5cbe -
Trigger Event:
release
-
Statement type: