Micropython的包管理

MicroPython包支持多种管理和安装方式,本文主要mipmpremote以及手动安装包的方式,另外也会说明下如何发布自己的包。

使用**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")

在Unix上使用**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 [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

可以设置--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,用户可通过mipmpremote自动获取并编译成字节码。更多信息请参见https://github.com/micropython/micropython-lib。

要编写可由 mipmpremote 下载的 "自托管 "软件包,需要一个静态网络服务器(或 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-defaultdictos-path,这两个文件会从micropython-lib自动安装。第三个依赖关系会安装GitHub仓库org/micropython-additions主分支package.json文件中定义的内容。

冻结包

当从设备文件系统导入一个Python模块或软件包时,它会被编译成RAM中的字节码,以便由虚拟机执行。对于.mpy文件,这一转换已经完成,但字节码最终仍在RAM 中。

对于低内存设备或大型应用,从ROM运行字节码可能更有优势。具体做法是将字节码 "冻结 "到MicroPython固件中,然后再刷到设备上。它们运行时的性能是一样的(虽然导入速度更快),但它可以释放大量内存供程序使用。

这种方法的缺点是开发速度要慢得多,因为每次都要刷固件,但对于冻结不常变化的依赖关系还是很有用的。

冻结是通过编写清单文件并在构建过程中使用(通常作为定制电路板定义的一部分)来实现的。更多信息请参阅 MicroPython manifest files 指南。

你可能感兴趣的:(micropython,硬件,单片机,物联网,python)