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.