Керування пакетами¶
Встановлення пакетів за допомогою mip¶
Плати з підтримкою мережі включають модуль mip, який може встановлювати пакети з micropython-lib та сторонніх сайтів (зокрема GitHub, GitLab).
mip («mip installs packages» — «mip встановлює пакети») концептуально схожий на інструмент pip Python, однак не використовує індекс 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, готовий до виконання VM. Для .mpy file це перетворення вже було зроблено, але байт-код все одно опиняється в RAM.
Для пристроїв з обмеженою пам’яттю або для великих застосунків може бути вигідно натомість виконувати байт-код з ROM (тобто флеш-пам’яті). Це можна зробити шляхом «заморожування» байт-коду у мікропрограму MicroPython, яка потім прошивається на пристрій. Продуктивність під час виконання залишається такою самою (хоча імпорт виконується швидше), але це може звільнити значні обсяги RAM для використання вашою програмою.
Недолік цього підходу полягає в тому, що розробка стає набагато повільнішою, оскільки доводиться прошивати мікропрограму кожен раз, але це все одно може бути корисним для заморожування залежностей, що рідко змінюються.
Заморожування здійснюється шляхом написання файлу маніфесту та його використання у збірці, часто як частини визначення користувацької плати. Дивіться посібник Файли маніфестів MicroPython для отримання додаткової інформації.