Csomagkezelés

Csomagok telepítése a mip segítségével

A hálózati képességekkel rendelkező kártyák tartalmazzák a mip modult, amely képes csomagokat telepíteni a micropython-lib tárból, valamint külső oldalakról (beleértve a GitHubot és a GitLabot).

A mip („mip installs packages”) koncepciójában hasonló a Python pip eszközéhez, azonban nem a PyPI indexet használja, hanem alapértelmezés szerint a micropython-lib tárat használja indexként. A mip a micropython-lib tárból való letöltéskor automatikusan lekéri az előfordított .mpy file fájlt.

A mip használatának leggyakoribb módja a REPL-ből történik:

>>> 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)

A mip egy megfelelő helyet észlel a fájlrendszerben úgy, hogy a sys.path listában megkeresi az első /lib végződésű bejegyzést. A célhelyet felülírhatod a target segítségével, de vedd figyelembe, hogy ennek az útvonalnak benne kell lennie a sys.path listában ahhoz, hogy később importálni lehessen:

>>> mip.install("pkgname", target="third-party")
>>> sys.path.append("third-party")

Azon túl, hogy csomagokat tölt le a micropython-lib indexből, a mip külső könyvtárakat is képes telepíteni. A legegyszerűbb módszer egy fájl közvetlen letöltése:

>>> mip.install("http://example.com/x/y/foo.py")
>>> mip.install("http://example.com/x/y/foo.mpy")

Egy fájl közvetlen telepítésekor a target argumentum továbbra is támogatott a célútvonal beállításához, de az mpy és a version figyelmen kívül marad.

Az URL github: vagy gitlab: előtaggal is kezdődhet, ami egy egyszerű módja annak, hogy a GitHubon vagy GitLabon tárolt tartalomra mutasson:

>>> 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

A bonyolultabb csomagok (azaz amelyek egynél több fájlból állnak, vagy függőségeik vannak) a package.json fájljukhoz vezető útvonal megadásával tölthetők le:

>>> mip.install("http://example.com/x/package.json")
>>> mip.install("github:org/user/path/package.json")
>>> mip.install("gitlab:org/user/path/package.json")

Ha nincs json fájl megadva, akkor a „package.json” implicit módon hozzáadódik:

>>> 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")

A mip használata a Unix porton

A Unix porton a mip a fentiek szerint használható a REPL-ben, valamint a -m használatával is:

$ ./micropython -m mip install pkgname-or-url
$ ./micropython -m mip install pkgname-or-url@version

A --target path, --no-mpy és --index argumentumok beállíthatók:

$ ./micropython -m mip install --target third-party pkgname
$ ./micropython -m mip install --no-mpy pkgname
$ ./micropython -m mip install --index https://host/pi pkgname

Csomagok telepítése a mpremote segítségével

A mpremote eszköz szintén tartalmazza ugyanazt a funkcionalitást, mint a mip, és egy gazdagép PC-ről használható csomagok telepítésére egy helyileg csatlakoztatott eszközre (pl. USB-n vagy UART-on keresztül):

$ 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

A --target=path, --no-mpy és --index argumentumok beállíthatók:

$ mpremote mip install --target=/flash/third-party pkgname
$ mpremote mip install --no-mpy pkgname
$ mpremote mip install --index https://host/pi pkgname

A mpremote képes csomagokat telepíteni a gazdagép helyi fájlrendszerén tárolt fájlokból is:

$ mpremote mip install path/to/pkg.py
$ mpremote mip install path/to/app/package.json
$ mpremote mip install \\path\\to\\pkg.py

Ez különösen hasznos a csomagok fejlesztés közbeni teszteléséhez, valamint a GitHub repók helyi klónjaiból történő csomagtelepítéshez. Vedd figyelembe, hogy a package.json fájlokban lévő URL-eknek perjelet („/”) kell használniuk könyvtárelválasztóként, még Windowson is, hogy kompatibilisek legyenek a webről történő telepítéssel.

Csomagok kézi telepítése

A csomagok kézzel is telepíthetők (akár .py, akár .mpy formában) úgy, hogy a fájlokat az eszközre másolod. A kártyától függően ez történhet USB tömegtárolón keresztül, a mpremote eszközzel (pl. mpremote fs cp path/to/package.py :package.py), a webrepl segítségével stb.

Csomagok írása és közzététele

A micropython-lib tárba való közzététel a legegyszerűbb módja annak, hogy a csomagodat széles körben elérhetővé tedd a MicroPython felhasználók számára, és automatikusan elérhetővé váljon a mip és mpremote segítségével, valamint bytecode-dá fordítva. További információkért lásd: https://github.com/micropython/micropython-lib .

Egy olyan „önállóan tárolt” csomag megírásához, amely a mip vagy mpremote segítségével letölthető, szükséged van egy statikus webszerverre (vagy a GitHubra), amely vagy egyetlen .py fájlt, vagy egy package.json fájlt tárol a .py fájljaid mellett.

Egy GitHubon tárolt példa mlx90640 könyvtár a következővel telepíthető:

$ mpremote mip install github:org/micropython-mlx90640

A csomag elrendezése a GitHubon a következőképpen nézhet ki:

https://github.com/org/micropython-mlx90640/
    package.json
    mlx90640/
        __init__.py
        utils.py

A package.json megadja a telepítendő fájlok helyét és egyéb függőségeket:

{
  "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"
}

Az urls lista a következő szerint adja meg a telepítendő fájlokat:

"urls": [
    [destination_path, source_url]
    ...

ahol a destination_path a telepítendő fájl helye és neve az eszközön, a source_url pedig a telepítendő fájl URL-je. A forrás URL-t általában a package.json fájlt tartalmazó könyvtárhoz képest relatívan adják meg, de lehet abszolút URL is, pl.:

["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]

A csomag a collections-defaultdict és az os-path csomagoktól függ, amelyek automatikusan települnek a micropython-lib tárból. A harmadik függőség azt a tartalmat telepíti, amelyet az org/micropython-additions GitHub repó main ágának package.json fájlja határoz meg.

Csomagok befagyasztása

Amikor egy Python modult vagy csomagot importálnak az eszköz fájlrendszeréből, az a RAM-ban bytecode kóddá fordul, készen arra, hogy a VM végrehajtsa. Egy .mpy file esetében ez az átalakítás már megtörtént, de a bytecode így is a RAM-ban végzi.

Az alacsony memóriájú eszközök vagy a nagy alkalmazások esetében előnyös lehet ehelyett a bytecode-ot ROM-ból (azaz flash memóriából) futtatni. Ezt a bytecode MicroPython firmware-be való „befagyasztásával” lehet megtenni, amelyet aztán az eszközre flashelnek. A futásidejű teljesítmény ugyanaz (bár az importálás gyorsabb), de jelentős mennyiségű RAM-ot szabadíthat fel a programod számára.

Ennek a megközelítésnek a hátránya, hogy sokkal lassabb a fejlesztés, mivel minden alkalommal flashelned kell a firmware-t, de így is hasznos lehet a ritkán változó függőségek befagyasztása.

A befagyasztás egy manifest fájl megírásával és a buildben való felhasználásával történik, gyakran egy egyéni kártyadefiníció részeként. További információkért lásd a MicroPython manifest fájlok útmutatót.