Pakketbeheer¶
Pakketten installeren met mip¶
Netwerkcapabele boards bevatten de module mip, waarmee pakketten kunnen worden geïnstalleerd vanuit micropython-lib en vanaf sites van derden (waaronder GitHub, GitLab).
mip (“mip installs packages”) lijkt qua concept op Python’s pip-tool, maar het gebruikt niet de PyPI-index, maar gebruikt standaard micropython-lib als index. mip zal automatisch het gecompileerde .mpy file ophalen bij het downloaden vanuit micropython-lib.
De meest gebruikelijke manier om mip te gebruiken is vanuit de 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 zal een geschikte locatie op het bestandssysteem detecteren door sys.path te doorzoeken naar de eerste vermelding die eindigt op /lib. U kunt de bestemming overschrijven met target, maar let op: dit pad moet in sys.path staan om het vervolgens te kunnen importeren:
>>> mip.install("pkgname", target="third-party")
>>> sys.path.append("third-party")
Naast het downloaden van pakketten uit de micropython-lib-index kan mip ook bibliotheken van derden installeren. De eenvoudigste manier is om een bestand rechtstreeks te downloaden:
>>> mip.install("http://example.com/x/y/foo.py")
>>> mip.install("http://example.com/x/y/foo.mpy")
Bij het rechtstreeks installeren van een bestand wordt het argument target nog steeds ondersteund om het bestemmingspad in te stellen, maar mpy en version worden genegeerd.
De URL kan ook beginnen met github: of gitlab: als een eenvoudige manier om te verwijzen naar inhoud die wordt gehost op GitHub of 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
Geavanceerdere pakketten (d.w.z. met meer dan één bestand, of met afhankelijkheden) kunnen worden gedownload door het pad naar hun package.json op te geven:
>>> mip.install("http://example.com/x/package.json")
>>> mip.install("github:org/user/path/package.json")
>>> mip.install("gitlab:org/user/path/package.json")
Als er geen json-bestand wordt opgegeven, dan wordt “package.json” impliciet toegevoegd:
>>> 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 gebruiken op de Unix-port¶
Op de Unix-port kan mip worden gebruikt vanuit de REPL zoals hierboven, en ook met behulp van -m
$ ./micropython -m mip install pkgname-or-url
$ ./micropython -m mip install pkgname-or-url@version
De argumenten --target path, --no-mpy en --index kunnen worden ingesteld:
$ ./micropython -m mip install --target third-party pkgname
$ ./micropython -m mip install --no-mpy pkgname
$ ./micropython -m mip install --index https://host/pi pkgname
Pakketten installeren met mpremote¶
De tool mpremote bevat ook dezelfde functionaliteit als mip en kan vanaf een host-pc worden gebruikt om pakketten te installeren op een lokaal aangesloten apparaat (bijv. via USB of 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
De argumenten --target=path, --no-mpy en --index kunnen worden ingesteld:
$ mpremote mip install --target=/flash/third-party pkgname
$ mpremote mip install --no-mpy pkgname
$ mpremote mip install --index https://host/pi pkgname
mpremote kan ook pakketten installeren vanuit bestanden die op het lokale bestandssysteem van de host zijn opgeslagen:
$ mpremote mip install path/to/pkg.py
$ mpremote mip install path/to/app/package.json
$ mpremote mip install \\path\\to\\pkg.py
Dit is vooral nuttig voor het testen van pakketten tijdens de ontwikkeling en voor het installeren van pakketten vanuit lokale klonen van GitHub-repositories. Let op: URL’s in package.json-bestanden moeten voorwaartse schuine strepen (“/”) als mapscheidingstekens gebruiken, zelfs op Windows, zodat ze compatibel zijn met installeren vanaf het web.
Pakketten handmatig installeren¶
Pakketten kunnen ook worden geïnstalleerd (in .py- of .mpy-vorm) door de bestanden handmatig naar het apparaat te kopiëren. Afhankelijk van het board kan dit via USB Mass Storage, de tool mpremote (bijv. mpremote fs cp path/to/package.py :package.py), webrepl, enz. zijn.
Pakketten schrijven en publiceren¶
Publiceren naar micropython-lib is de eenvoudigste manier om uw pakket breed toegankelijk te maken voor MicroPython-gebruikers, automatisch beschikbaar via mip en mpremote en gecompileerd naar bytecode. Zie https://github.com/micropython/micropython-lib voor meer informatie.
Om een “zelf-gehost” pakket te schrijven dat kan worden gedownload door mip of mpremote, hebt u een statische webserver (of GitHub) nodig om ofwel een enkel .py-bestand te hosten, ofwel een package.json-bestand naast uw .py-bestanden.
Een voorbeeld-mlx90640-bibliotheek die op GitHub wordt gehost, zou kunnen worden geïnstalleerd met:
$ mpremote mip install github:org/micropython-mlx90640
De indeling voor het pakket op GitHub zou er zo uit kunnen zien:
https://github.com/org/micropython-mlx90640/
package.json
mlx90640/
__init__.py
utils.py
De package.json specificeert de locatie van de te installeren bestanden en andere afhankelijkheden:
{
"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"
}
De lijst urls specificeert de te installeren bestanden volgens:
"urls": [
[destination_path, source_url]
...
waarbij destination_path de locatie en naam is van het bestand dat op het apparaat moet worden geïnstalleerd en source_url de URL is van het te installeren bestand. De bron-URL wordt gewoonlijk gespecificeerd relatief ten opzichte van de map die het package.json-bestand bevat, maar kan ook een absolute URL zijn, bijv.:
["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]
Het pakket is afhankelijk van collections-defaultdict en os-path die automatisch worden geïnstalleerd vanuit de micropython-lib. De derde afhankelijkheid installeert de inhoud zoals gedefinieerd door het package.json-bestand van de main-branch van de GitHub-repo org/micropython-additions.
Pakketten bevriezen¶
Wanneer een Python-module of -pakket wordt geïmporteerd vanaf het bestandssysteem van het apparaat, wordt het in RAM gecompileerd naar bytecode, klaar om door de VM te worden uitgevoerd. Voor een .mpy file is deze conversie al gedaan, maar de bytecode belandt nog steeds in RAM.
Voor apparaten met weinig geheugen, of voor grote applicaties, kan het voordelig zijn om de bytecode in plaats daarvan vanuit ROM (d.w.z. flashgeheugen) uit te voeren. Dit kan worden gedaan door de bytecode in de MicroPython-firmware te “bevriezen”, die vervolgens naar het apparaat wordt geflasht. De runtime-prestaties zijn hetzelfde (hoewel importeren sneller is), maar het kan aanzienlijke hoeveelheden RAM vrijmaken voor gebruik door uw programma.
Het nadeel van deze aanpak is dat het veel trager ontwikkelt, omdat u telkens de firmware moet flashen, maar het kan nog steeds nuttig zijn om afhankelijkheden te bevriezen die niet vaak veranderen.
Bevriezen gebeurt door een manifestbestand te schrijven en dit in de build te gebruiken, vaak als onderdeel van een aangepaste boarddefinitie. Zie de MicroPython manifest-bestanden-gids voor meer informatie.