MicroPython包支持多种管理和安装方式,本文主要mip
、mpremote
以及手动安装包的方式,另外也会说明下如何发布自己的包。
mip
**安装包mip
(“mip installs packages”)是一个跟Python pip
概念类似的工具,但它不使用PyPI索引,而是默认使用micropython-lib作为索引,支持网络的板子通常包含mip
模块,可以从micropython-lib或第三方站点(如:GitHub)安装包。
通常可以在REPL
中使用mip
:
>>> import mip
>>> mip.install("pkgname") # 安装最新版本的"pkgname"包及其依赖
>>> mip.install("pkgname", version="x.y") #安装版本为x.y的"pkgname"包
>>> mip.install("pkgname", mpy=False) #安装源代码版本(如.py而不是.mpy文件)
mip
通过搜索sys.path
中第一个以/lib
结尾的条目来检测文件系统中适当的位置,可以使用target
来覆盖目标位置,但要注意,该路径必须在sys.path
中,以便随后导入:
>>> mip.install("pkgname", target="third-party")
>>> sys.path.append("third-party")
除了使用micropython-lib
索引下载软件包,mip
还可以安装第三方库。最简单的方法是直接下载文件:
>>> mip.install("http://example.com/x/y/foo.py")
>>> mip.install("http://example.com/x/y/foo.mpy")
直接安装文件时,仍支持使用target
参数设置目标路径,但会忽略mpy
和版本。
URL也可以以github:
开头,作为指向GitHub上托管内容的一种简单方式:
>>> mip.install("github:org/repo/path/foo.py") # 使用缺省分支
>>> mip.install("github:org/repo/path/foo.py", version="branch-or-tag") # 可选特定的分支或Tag
更复杂的软件包(即包含多个文件或有依赖关系)可通过指定 package.json 的路径下载。
>>> mip.install("http://example.com/x/package.json")
>>> mip.install("github:org/user/path/package.json")
如果没有指定json文件,则会隐式添加"package.json":
>>> mip.install("http://example.com/x/")
>>> mip.install("github:org/repo") # 使用 repo 的缺省分支
>>> mip.install("github:org/repo", version="branch-or-tag")
mpi
**在Unix环境,也可在REPL中使用mip
,如上文所述,也可使用 -m:
$ ./micropython -m mip install pkgname-or-url
$ ./micropython -m mip install pkgname-or-url@version
可以设置--target=path
、--no-mpy
和--index
参数:
$ ./micropython -m mip install --target=third-party pkgname
$ ./micropython -m mip install --no-mpy pkgname
$ ./micropython -m mip install --index https://host/pi pkgname
mpremot
**安装包mpremote工具也具有与mip相同的功能,可用于从PC主机将软件包安装到本地连接的设备上(如通过 USB 或 UART):
$ mpremote mip install pkgname
$ mpremote mip install pkgname@x.y
$ mpremote mip install http://example.com/x/y/foo.py
$ mpremote mip install github:org/repo
$ mpremote mip install github:org/repo@branch-or-tag
可以设置--target=path、``--no-mpy
和--index
参数:
$ mpremote mip install --target=/flash/third-party pkgname
$ mpremote mip install --no-mpy pkgname
$ mpremote mip install --index https://host/pi pkgname
也可以通过手动将文件复制到设备来安装软件包(.py或.mpy 格式)。根据电路板的不同,可以通过大容量USB存储器、mpremote工具(例如 mpremote fs cp path/to/package.py :package.py
)、webrepl 等方式实现。
让MicroPython用户广泛的访问你的软件包最简单的方法是发布到 microropython-lib,用户可通过mip
和mpremote
自动获取并编译成字节码。更多信息请参见https://github.com/micropython/micropython-lib。
要编写可由 mip
或 mpremote
下载的 "自托管 "软件包,需要一个静态网络服务器(或 GitHub)来托管单个.py
文件或与.py
文件一起托管的package.json
文件。
下面是mlx90640
库的package.json
文件:
{
"urls": [
["mlx90640/__init__.py", "github:org/micropython-mlx90640/mlx90640/__init__.py"],
["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]
],
"deps": [
["collections-defaultdict", "latest"],
["os-path", "latest"],
["github:org/micropython-additions", "main"]
],
"version": "0.2"
}
它包括两个文件,托管在名为 org/micropython-mlx90640
的GitHub仓库中,安装到设备上的mlx90640
目录中。依赖collections-defaultdict
和os-path
,这两个文件会从micropython-lib
自动安装。第三个依赖关系会安装GitHub仓库org/micropython-additions
主分支package.json
文件中定义的内容。
当从设备文件系统导入一个Python模块或软件包时,它会被编译成RAM中的字节码,以便由虚拟机执行。对于.mpy
文件,这一转换已经完成,但字节码最终仍在RAM 中。
对于低内存设备或大型应用,从ROM运行字节码可能更有优势。具体做法是将字节码 "冻结 "到MicroPython固件中,然后再刷到设备上。它们运行时的性能是一样的(虽然导入速度更快),但它可以释放大量内存供程序使用。
这种方法的缺点是开发速度要慢得多,因为每次都要刷固件,但对于冻结不常变化的依赖关系还是很有用的。
冻结是通过编写清单文件并在构建过程中使用(通常作为定制电路板定义的一部分)来实现的。更多信息请参阅 MicroPython manifest files 指南。