Управление пакетами

Установка пакетов с помощью mip

Платы с поддержкой сети включают модуль mip, который может устанавливать пакеты из micropython-lib и со сторонних сайтов (включая GitHub, GitLab).

mip («mip installs packages») по концепции похож на инструмент Python pip, однако он не использует индекс PyPI, а по умолчанию использует micropython-lib в качестве своего индекса. mip будет автоматически загружать скомпилированный .mpy file при загрузке из micropython-lib.

Наиболее распространённый способ использования 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")

Использование mip на порте Unix

На порте 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, и может использоваться с хост-ПК для установки пакетов на локально подключённое устройство (например, через 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. Обратите внимание, что URL-адреса в файлах package.json должны использовать прямые слэши («/») в качестве разделителей каталогов, даже в Windows, чтобы быть совместимыми с установкой из веба.

Установка пакетов вручную

Пакеты также можно установить (в форме .py или .mpy) путём ручного копирования файлов на устройство. В зависимости от платы это может быть через USB Mass Storage, инструмент 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, либо файла package.json рядом с вашими файлами .py.

Пример библиотеки mlx90640, размещённой на GitHub, можно установить с помощью:

$ 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. Третья зависимость устанавливает содержимое, определённое файлом package.json ветки main репозитория GitHub org/micropython-additions.

Заморозка пакетов

Когда модуль или пакет Python импортируется из файловой системы устройства, он компилируется в bytecode в RAM, готовый к выполнению виртуальной машиной. Для .mpy file это преобразование уже выполнено, но байт-код всё равно оказывается в RAM.

Для устройств с малым объёмом памяти или для больших приложений может быть выгодно вместо этого запускать байт-код из ROM (т. е. из флеш-памяти). Это можно сделать, «заморозив» байт-код в прошивку MicroPython, которая затем прошивается на устройство. Производительность во время выполнения остаётся такой же (хотя импорт происходит быстрее), но это может освободить значительный объём RAM для использования вашей программой.

Недостаток этого подхода в том, что разработка идёт намного медленнее, потому что вам приходится прошивать прошивку каждый раз, но всё же может быть полезно заморозить зависимости, которые не меняются часто.

Заморозка выполняется путём написания файла манифеста и использования его при сборке, часто как часть пользовательского определения платы. Подробнее см. руководство Файлы манифеста MicroPython.