包管理

使用 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 参数以设置目标路径,但 mpyversion 会被忽略。

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 用户使用的最简单方式,并且可以通过 mipmpremote 自动获取并编译为字节码。更多信息请参阅 https://github.com/micropython/micropython-lib

要编写一个可由 mipmpremote 下载的"自托管"包,你需要一个静态网页服务器(或 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-defaultdictos-path,它们将从 micropython-lib 自动安装。第三个依赖项安装的内容由 GitHub 仓库 org/micropython-additionsmain 分支的 package.json 文件所定义。

冻结包

当从设备文件系统导入 Python 模块或包时,它会在 RAM 中被编译为 bytecode,准备好由 VM 执行。对于 .mpy file,这一转换已经完成,但字节码仍最终位于 RAM 中。

对于低内存设备或大型应用程序,转而从 ROM(即闪存)运行字节码可能更有优势。这可以通过将字节码"冻结"到 MicroPython 固件中来实现,然后再将固件烧录到设备上。运行时性能相同(尽管导入更快),但它可以为你的程序释放出大量的 RAM 供其使用。

这种方法的缺点是开发速度慢得多,因为你每次都必须烧录固件,但对于冻结那些不经常变动的依赖项而言,它仍然很有用。

冻结是通过编写一个清单文件并在构建中使用它来完成的,通常作为自定义开发板定义的一部分。更多信息请参阅 MicroPython 清单(manifest)文件 指南。