Gestione dei pacchetti¶
Installazione di pacchetti con mip¶
Le schede con capacità di rete includono il modulo mip, che può installare pacchetti da micropython-lib e da siti di terze parti (inclusi GitHub e GitLab).
mip («mip installs packages») è simile come concetto allo strumento pip di Python, tuttavia non usa l’indice PyPI, bensì usa micropython-lib come proprio indice per impostazione predefinita. mip recupererà automaticamente il .mpy file compilato durante il download da micropython-lib.
Il modo più comune di usare mip è dal 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 rileverà una posizione appropriata sul filesystem cercando in sys.path la prima voce che termina con /lib. Puoi sovrascrivere la destinazione usando target, ma nota che questo percorso deve essere in sys.path per poterlo successivamente importare:
>>> mip.install("pkgname", target="third-party")
>>> sys.path.append("third-party")
Oltre a scaricare pacchetti dall’indice micropython-lib, mip può anche installare librerie di terze parti. Il modo più semplice è scaricare direttamente un file:
>>> mip.install("http://example.com/x/y/foo.py")
>>> mip.install("http://example.com/x/y/foo.mpy")
Quando si installa direttamente un file, l’argomento target è comunque supportato per impostare il percorso di destinazione, ma mpy e version vengono ignorati.
L’URL può anche iniziare con github: o gitlab: come modo semplice per puntare a contenuti ospitati su GitHub o 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
Pacchetti più complessi (ad esempio con più di un file, o con dipendenze) possono essere scaricati specificando il percorso del loro 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")
Se non viene specificato alcun file json, allora viene aggiunto implicitamente «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")
Uso di mip sulla porta Unix¶
Sulla porta Unix, mip può essere usato dal REPL come sopra, e anche usando -m
$ ./micropython -m mip install pkgname-or-url
$ ./micropython -m mip install pkgname-or-url@version
Gli argomenti --target path, --no-mpy e --index possono essere impostati:
$ ./micropython -m mip install --target third-party pkgname
$ ./micropython -m mip install --no-mpy pkgname
$ ./micropython -m mip install --index https://host/pi pkgname
Installazione di pacchetti con mpremote¶
Anche lo strumento mpremote include la stessa funzionalità di mip e può essere usato da un PC host per installare pacchetti su un dispositivo connesso localmente (ad esempio tramite USB o 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
Gli argomenti --target=path, --no-mpy e --index possono essere impostati:
$ mpremote mip install --target=/flash/third-party pkgname
$ mpremote mip install --no-mpy pkgname
$ mpremote mip install --index https://host/pi pkgname
mpremote può anche installare pacchetti da file memorizzati nel filesystem locale dell’host:
$ mpremote mip install path/to/pkg.py
$ mpremote mip install path/to/app/package.json
$ mpremote mip install \\path\\to\\pkg.py
Questo è particolarmente utile per testare i pacchetti durante lo sviluppo e per installare pacchetti da cloni locali di repository GitHub. Nota che gli URL nei file package.json devono usare le barre in avanti («/») come separatori di directory, anche su Windows, in modo da essere compatibili con l’installazione dal web.
Installazione manuale dei pacchetti¶
I pacchetti possono anche essere installati (in forma .py o .mpy) copiando manualmente i file sul dispositivo. A seconda della scheda questo potrebbe avvenire tramite USB Mass Storage, lo strumento mpremote (ad esempio mpremote fs cp path/to/package.py :package.py), webrepl, ecc.
Scrittura e pubblicazione dei pacchetti¶
Pubblicare su micropython-lib è il modo più semplice per rendere il tuo pacchetto ampiamente accessibile agli utenti di MicroPython, e automaticamente disponibile tramite mip e mpremote nonché compilato in bytecode. Vedi https://github.com/micropython/micropython-lib per maggiori informazioni.
Per scrivere un pacchetto «self-hosted» che possa essere scaricato da mip o mpremote, hai bisogno di un webserver statico (o di GitHub) per ospitare un singolo file .py, oppure un file package.json insieme ai tuoi file .py.
Una libreria di esempio mlx90640 ospitata su GitHub potrebbe essere installata con:
$ mpremote mip install github:org/micropython-mlx90640
La struttura del pacchetto su GitHub potrebbe avere questo aspetto:
https://github.com/org/micropython-mlx90640/
package.json
mlx90640/
__init__.py
utils.py
Il package.json specifica la posizione dei file da installare e le altre dipendenze:
{
"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"
}
L’elenco urls specifica i file da installare secondo:
"urls": [
[destination_path, source_url]
...
dove destination_path è la posizione e il nome del file da installare sul dispositivo e source_url è l’URL del file da installare. L’URL sorgente verrebbe solitamente specificato relativamente alla directory contenente il file package.json, ma può anche essere un URL assoluto, ad esempio:
["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]
Il pacchetto dipende da collections-defaultdict e os-path che verranno installati automaticamente da micropython-lib. La terza dipendenza installa il contenuto definito dal file package.json del branch main del repo GitHub org/micropython-additions.
Freezing dei pacchetti¶
Quando un modulo o pacchetto Python viene importato dal filesystem del dispositivo, viene compilato in bytecode nella RAM, pronto per essere eseguito dalla VM. Per un .mpy file, questa conversione è già stata effettuata, ma il bytecode finisce comunque nella RAM.
Per i dispositivi con poca memoria, o per le applicazioni di grandi dimensioni, può essere vantaggioso eseguire invece il bytecode dalla ROM (cioè la memoria flash). Questo può essere fatto eseguendo il «freezing» del bytecode nel firmware di MicroPython, che viene poi flashato sul dispositivo. Le prestazioni a runtime sono le stesse (sebbene l’importazione sia più veloce), ma può liberare quantità significative di RAM per l’uso da parte del tuo programma.
Lo svantaggio di questo approccio è che lo sviluppo è molto più lento, perché devi flashare il firmware ogni volta, ma può comunque essere utile congelare le dipendenze che non cambiano spesso.
Il freezing si effettua scrivendo un file manifest e usandolo nella build, spesso come parte di una definizione di scheda personalizzata. Vedi la guida File manifest di MicroPython per maggiori informazioni.