包管理¶
使用 mip 安装包¶
具备网络功能的开发板包含 mip 模块,它可以从 micropython-lib 以及第三方站点(包括 GitHub、GitLab)安装包。
mip("mip installs packages")在概念上类似于 Python 的 pip 工具,但它不使用 PyPI 索引,而是默认使用 micropython-lib 作为其索引。从 micropython-lib 下载时,mip 会自动获取编译好的 .mpy file。
使用 mip 最常见的方式是在 REPL 中:
>>> import mip
>>> mip.install("pkgname") # Installs the latest version of "pkgname" (and dependencies)
>>> mip.install("pkgname", version="x.y") # Installs version x.y of "pkgname"
>>> mip.install("pkgname", mpy=False) # Installs the source version (i.e. .py rather than .mpy files)
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 和 version 会被忽略。
URL 也可以以 github: 或 gitlab: 开头,作为指向托管在 GitHub 或 GitLab 上的内容的一种简便方式:
>>> mip.install("github:org/repo/path/foo.py") # Uses default branch
>>> mip.install("github:org/repo/path/foo.py", version="branch-or-tag") # Optionally specify the branch or tag
>>> mip.install("gitlab:org/repo/path/foo.py") # Uses default branch
>>> mip.install("gitlab:org/repo/path/foo.py", version="branch-or-tag") # Optionally specify the branch or tag
更复杂的包(即包含多个文件,或带有依赖项的包)可以通过指定其 package.json 的路径来下载:
>>> mip.install("http://example.com/x/package.json")
>>> mip.install("github:org/user/path/package.json")
>>> mip.install("gitlab:org/user/path/package.json")
如果未指定 json 文件,则会隐式添加 "package.json":
>>> mip.install("http://example.com/x/")
>>> mip.install("github:org/repo") # Uses default branch of that repo
>>> mip.install("github:org/repo", version="branch-or-tag")
>>> mip.install("gitlab:org/repo") # Uses default branch of that repo
>>> mip.install("gitlab:org/repo", version="branch-or-tag")
在 Unix 端口上使用 mip¶
在 Unix 端口上,mip 可以像上面那样在 REPL 中使用,也可以通过 -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
使用 mpremote 安装包¶
mpremote 工具也包含与 mip 相同的功能,可以从主机 PC 用于向本地连接的设备(例如通过 USB 或 UART)安装包:
$ mpremote mip install pkgname
$ mpremote mip install [email protected]
$ 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
$ mpremote mip install gitlab:org/repo
$ mpremote mip install gitlab: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
mpremote 还可以从存储在主机本地文件系统上的文件安装包:
$ mpremote mip install path/to/pkg.py
$ mpremote mip install path/to/app/package.json
$ mpremote mip install \\path\\to\\pkg.py
这在开发期间测试包以及从 GitHub 仓库的本地克隆安装包时尤其有用。请注意,package.json 文件中的 URL 必须使用正斜杠("/")作为目录分隔符,即使在 Windows 上也是如此,以便它们与从网络安装兼容。
手动安装包¶
也可以通过手动将文件复制到设备上来安装包(以 .py 或 .mpy 形式)。根据开发板的不同,这可能通过 USB 大容量存储、mpremote 工具(例如 mpremote fs cp path/to/package.py :package.py)、webrepl 等来完成。
编写与发布包¶
发布到 micropython-lib 是让你的包广泛地供 MicroPython 用户使用的最简单方式,并且可以通过 mip 和 mpremote 自动获取并编译为字节码。更多信息请参阅 https://github.com/micropython/micropython-lib 。
要编写一个可由 mip 或 mpremote 下载的"自托管"包,你需要一个静态网页服务器(或 GitHub)来托管单个 .py 文件,或者托管一个与你的 .py 文件放在一起的 package.json 文件。
一个托管在 GitHub 上的示例 mlx90640 库可以这样安装:
$ mpremote mip install github:org/micropython-mlx90640
该包在 GitHub 上的布局可能如下所示:
https://github.com/org/micropython-mlx90640/
package.json
mlx90640/
__init__.py
utils.py
package.json 指定了要安装的文件的位置以及其他依赖项:
{
"urls": [
["mlx90640/__init__.py", "mlx90640/__init__.py"],
["mlx90640/utils.py", "mlx90640/utils.py"]
],
"deps": [
["collections-defaultdict", "latest"],
["os-path", "latest"],
["github:org/micropython-additions", "main"],
["gitlab:org/micropython-otheradditions", "main"]
],
"version": "0.2"
}
urls 列表按如下方式指定要安装的文件:
"urls": [
[destination_path, source_url]
...
其中 destination_path 是要安装到设备上的文件的位置和名称,source_url 是要安装的文件的 URL。源 URL 通常相对于包含 package.json 文件的目录来指定,但也可以是绝对 URL,例如:
["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]
该包依赖于 collections-defaultdict 和 os-path,它们将从 micropython-lib 自动安装。第三个依赖项安装的内容由 GitHub 仓库 org/micropython-additions 的 main 分支的 package.json 文件所定义。
冻结包¶
当从设备文件系统导入 Python 模块或包时,它会在 RAM 中被编译为 bytecode,准备好由 VM 执行。对于 .mpy file,这一转换已经完成,但字节码仍最终位于 RAM 中。
对于低内存设备或大型应用程序,转而从 ROM(即闪存)运行字节码可能更有优势。这可以通过将字节码"冻结"到 MicroPython 固件中来实现,然后再将固件烧录到设备上。运行时性能相同(尽管导入更快),但它可以为你的程序释放出大量的 RAM 供其使用。
这种方法的缺点是开发速度慢得多,因为你每次都必须烧录固件,但对于冻结那些不经常变动的依赖项而言,它仍然很有用。
冻结是通过编写一个清单文件并在构建中使用它来完成的,通常作为自定义开发板定义的一部分。更多信息请参阅 MicroPython 清单(manifest)文件 指南。