分发包、包管理和部署应用程序 - 以 microdot 为例
正如“大”Python 一样,MicroPython 支持创建“第三方”包,分发它们,并在每个用户的环境中轻松安装它们。本章讨论如何实现这些操作。建议对 Python 打包有一定的了解。
概述
以下步骤表示创建和使用包时的高级工作流程:
- Python 模块和包被转换为分发包档案,并在 Python 包索引 (PyPI) 上发布。
- upip 包管理器可用于在具有网络功能的 MicroPython 设备上安装、分发包(例如,在 Unix 设备上)。v1.19 后已改为 mip。
- 对于没有联网能力的端口,可以在Unix设备上准备一个“安装映像”,并通过合适的方式传输到设备上。
- 对于低内存端口,可以将安装映像冻结为 MicroPython 可执行文件的字节码,从而最大限度地减少内存存储开销。
mip (mip installs packages) 的概念与 Python 的 pip 工具相似,但是它不使用 pypi 索引,默认情况下,是使用 micropython-lib 作为其索引。 从micropython-lib 下载时,mip 将自动获取 .mpy 文件。该模块可以从 micropython-lib 和第三方站点(包括GitHub)安装包装。
在 REPL 环境下使用 mip 安装的语法,但先决条件是 ESP32-CAM 必须要先连上网。
import mip
mip.install("pkgname") # 直接指定包名称,会从 https://micropython.org/pi/v2 找寻并安装
mip.install("pkgname", version="x.y") # 指定包名称与版次
mip.install("pkgname", mpy=False) # 安装原码文件 (会是 .py 而不是 .mpy 档)
mip.install("http://example.com/x/y/foo.py") # 安装第三方包
mip.install("github:org/repo/path/foo.py", target="third-party") # 从 GitHub 直接安装
mip.install("github:org/user/path/package.json") # 安装比较复杂的包,包含了一些相依库的描述
mip 预设会把包安装在(/lib) 中。如果有指定 target 选项,则会安装在该目录,但记得在 sys.path 变量中,加入该目录 (sys.path.append("third-party")
),不然 import 会找不到该包的所在位置。
安装 mip
因为原先固件预设没有安装mip,所以要透过远程方式 (mpremote) 安装 mip,命令如下。
mpremote connect /dev/cu.usbserial-14110 mip install mip
下图可以看到在本机的终端上进行安装 mip,会连到 https://micropython.org/pi/v2 网站进行搜寻并下载安装,会安装在 ESP32-CAM 的 /lib 路径,安装时会一并安装相依套件 urequests,安装完毕后再进入 REPL 环境,就可以正常使用 mip。
图 1. 使用 mpremote 安装 mip
再次强调,在 REPL 环境下一定要先连结网络,才能进行安装,不然会出现错误,画面如下。
图 2. 在 REPL 使用 mip 安装
所以,使用 mpremote 安装是比较常用的方法。
手动安装包 - microdot
以下展示安装 microdot 这个第三方软件的包,microdot (https://github.com/miguelgrinberg/microdot) ,(百度云盘,提取码ccit)是一个由 Flask 启发的简约 Python Web 框架,是支援 Python 和 MicroPython 的小型网络框架,旨在有限资源(例如微控制器)的系统上运行。目前可以在 PyPi 直接安装,但是在 MicroPython 只能手动安装,安装方法十分简单,可以选择从 github 或是本地上传,命令如下。
# 从 github 安装
mpremote connect /dev/cu.usbserial-14110 mip install https://raw.githubusercontent.com/miguelgrinberg/microdot/main/src/microdot.py
# 或是事先下载原码,直接上传到 ESP32-CAM 就可以
mpremote connect /dev/cu.usbserial-14110 cp microdot.py :/lib/
mpremote connect /dev/cu.usbserial-14110 ls /lib
下图显示手动本地文件上传来进行安装,安装完后使用 ls
命令来检视是否上传成功,接著再连接上 ESP32-CAM 直接运行代码,确认包装无误。
图 3. 使用本地手动安装
参考代码
from microdot import Microdot
app = Microdot()
参考资料
- mPython help documentation, https://mpython.readthedocs.io/en/master/index.html
- MicroPython 文档, http://micropython.86x.net/en/latet/index-2.html
- MicroPython documentation, https://docs.micropython.org/en/latest/index.html
- 关于MicroPython mpremote工具 的一些用例, https://www.cnblogs.com/Wind-stormger/p/16659124.html
- microdot, https://github.com/miguelgrinberg/microdot
- Secrets of MicroPython: ESP32 Web Server using Microdot, https://bhave.sh/micropython-microdot/