Zarządzanie pakietami¶
Instalowanie pakietów za pomocą mip¶
Płytki z obsługą sieci zawierają moduł mip, który może instalować pakiety z micropython-lib oraz z witryn zewnętrznych (w tym GitHub, GitLab).
mip („mip installs packages”) jest koncepcyjnie podobny do narzędzia pip z Pythona, jednak nie używa indeksu PyPI, lecz domyślnie wykorzystuje jako swój indeks micropython-lib. mip automatycznie pobierze skompilowany .mpy file podczas pobierania z micropython-lib.
Najczęstszym sposobem użycia mip jest praca z poziomu 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 wykryje odpowiednią lokalizację w systemie plików, przeszukując sys.path w poszukiwaniu pierwszego wpisu kończącego się na /lib. Miejsce docelowe można nadpisać za pomocą target, ale pamiętaj, że ścieżka ta musi znajdować się w sys.path, aby później dało się ją zaimportować:
>>> mip.install("pkgname", target="third-party")
>>> sys.path.append("third-party")
Oprócz pobierania pakietów z indeksu micropython-lib, mip może również instalować biblioteki zewnętrzne. Najprostszym sposobem jest pobranie pliku bezpośrednio:
>>> mip.install("http://example.com/x/y/foo.py")
>>> mip.install("http://example.com/x/y/foo.mpy")
Podczas instalowania pliku bezpośrednio argument target jest nadal obsługiwany w celu ustawienia ścieżki docelowej, ale mpy oraz version są ignorowane.
Adres URL może również zaczynać się od github: lub gitlab: jako prosty sposób wskazania zawartości hostowanej na GitHubie lub GitLabie:
>>> 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
Bardziej zaawansowane pakiety (tj. z więcej niż jednym plikiem lub z zależnościami) można pobrać, podając ścieżkę do ich pliku 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")
Jeśli nie podano pliku json, to „package.json” jest dodawany niejawnie:
>>> 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")
Używanie mip w porcie Unix¶
W porcie Unix mip można używać z poziomu REPL jak powyżej, a także za pomocą -m
$ ./micropython -m mip install pkgname-or-url
$ ./micropython -m mip install pkgname-or-url@version
Argumenty --target path, --no-mpy oraz --index można ustawić:
$ ./micropython -m mip install --target third-party pkgname
$ ./micropython -m mip install --no-mpy pkgname
$ ./micropython -m mip install --index https://host/pi pkgname
Instalowanie pakietów za pomocą mpremote¶
Narzędzie mpremote zawiera również tę samą funkcjonalność co mip i może być używane z komputera hosta do instalowania pakietów na lokalnie podłączonym urządzeniu (np. przez USB lub 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
Argumenty --target=path, --no-mpy oraz --index można ustawić:
$ mpremote mip install --target=/flash/third-party pkgname
$ mpremote mip install --no-mpy pkgname
$ mpremote mip install --index https://host/pi pkgname
mpremote może również instalować pakiety z plików przechowywanych w lokalnym systemie plików hosta:
$ mpremote mip install path/to/pkg.py
$ mpremote mip install path/to/app/package.json
$ mpremote mip install \\path\\to\\pkg.py
Jest to szczególnie przydatne do testowania pakietów podczas tworzenia oraz do instalowania pakietów z lokalnych klonów repozytoriów GitHub. Pamiętaj, że adresy URL w plikach package.json muszą używać ukośników w prawo („/”) jako separatorów katalogów, nawet w systemie Windows, aby były zgodne z instalacją z sieci.
Ręczne instalowanie pakietów¶
Pakiety można również instalować (w postaci .py lub .mpy), ręcznie kopiując pliki na urządzenie. W zależności od płytki może to odbywać się przez USB Mass Storage, narzędzie mpremote (np. mpremote fs cp path/to/package.py :package.py), webrepl itd.
Pisanie i publikowanie pakietów¶
Publikowanie w micropython-lib to najłatwiejszy sposób, aby udostępnić swój pakiet szerokiemu gronu użytkowników MicroPython oraz automatycznie udostępnić go przez mip i mpremote i skompilować do bytecode. Więcej informacji znajdziesz na https://github.com/micropython/micropython-lib.
Aby napisać „samodzielnie hostowany” pakiet, który można pobrać za pomocą mip lub mpremote, potrzebny jest statyczny serwer WWW (lub GitHub) do hostowania pojedynczego pliku .py albo pliku package.json obok plików .py.
Przykładową bibliotekę mlx90640 hostowaną na GitHubie można zainstalować za pomocą:
$ mpremote mip install github:org/micropython-mlx90640
Układ pakietu na GitHubie mógłby wyglądać tak:
https://github.com/org/micropython-mlx90640/
package.json
mlx90640/
__init__.py
utils.py
Plik package.json określa lokalizację plików do zainstalowania oraz inne zależności:
{
"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"
}
Lista urls określa pliki do zainstalowania zgodnie z:
"urls": [
[destination_path, source_url]
...
gdzie destination_path to lokalizacja i nazwa pliku, który ma zostać zainstalowany na urządzeniu, a source_url to adres URL pliku, który ma zostać zainstalowany. Źródłowy adres URL jest zwykle podawany względem katalogu zawierającego plik package.json, ale może być również bezwzględnym adresem URL, np.:
["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]
Pakiet zależy od collections-defaultdict oraz os-path, które zostaną automatycznie zainstalowane z micropython-lib. Trzecia zależność instaluje zawartość zdefiniowaną przez plik package.json gałęzi main repozytorium GitHub org/micropython-additions.
Zamrażanie pakietów¶
Gdy moduł lub pakiet Pythona jest importowany z systemu plików urządzenia, jest kompilowany do bytecode w pamięci RAM, gotowy do wykonania przez maszynę wirtualną (VM). W przypadku .mpy file konwersja ta została już wykonana, ale bytecode i tak trafia do pamięci RAM.
W przypadku urządzeń o małej ilości pamięci lub dużych aplikacji korzystne może być uruchamianie bytecode’u z pamięci ROM (tj. pamięci flash). Można to zrobić, „zamrażając” bytecode w oprogramowaniu układowym MicroPython, które jest następnie wgrywane na urządzenie. Wydajność w czasie wykonania jest taka sama (choć importowanie jest szybsze), ale może to uwolnić znaczne ilości pamięci RAM do użytku przez Twój program.
Wadą tego podejścia jest znacznie wolniejsze tworzenie, ponieważ za każdym razem trzeba wgrywać oprogramowanie układowe, ale wciąż może być przydatne zamrażanie zależności, które nie zmieniają się często.
Zamrażanie odbywa się poprzez napisanie pliku manifestu i użycie go w procesie budowania, często jako część niestandardowej definicji płytki. Więcej informacji znajdziesz w przewodniku Pliki manifestu MicroPython.