Gestión de paquetes

Instalación de paquetes con mip

Las placas con capacidad de red incluyen el módulo mip, que puede instalar paquetes desde micropython-lib y desde sitios de terceros (incluidos GitHub y GitLab).

mip («mip installs packages») es similar en concepto a la herramienta pip de Python, pero no usa el índice PyPI, sino que usa micropython-lib como índice por defecto. mip obtendrá automáticamente el .mpy file compilado al descargar desde micropython-lib.

La forma más habitual de usar mip es desde la 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 detectará una ubicación apropiada en el sistema de archivos buscando en sys.path la primera entrada que termine en /lib. Puedes anular el destino usando target, pero ten en cuenta que esta ruta debe estar en sys.path para poder importarla posteriormente:

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

Además de descargar paquetes desde el índice de micropython-lib, mip también puede instalar bibliotecas de terceros. La forma más sencilla es descargar un archivo directamente:

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

Al instalar un archivo directamente, el argumento target sigue admitiéndose para establecer la ruta de destino, pero mpy y version se ignoran.

La URL también puede comenzar con github: o gitlab: como una forma sencilla de apuntar a contenido alojado en 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

Los paquetes más sofisticados (es decir, con más de un archivo o con dependencias) pueden descargarse especificando la ruta a su 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")

Si no se especifica ningún archivo json, se añade implícitamente «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 de mip en el port de Unix

En el port de Unix, mip puede usarse en la REPL como se ha indicado arriba, y también usando -m:

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

Los argumentos --target path, --no-mpy e --index pueden establecerse:

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

Instalación de paquetes con mpremote

La herramienta mpremote también incluye la misma funcionalidad que mip y puede usarse desde un PC host para instalar paquetes en un dispositivo conectado localmente (p. ej. mediante 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

Los argumentos --target=path, --no-mpy e --index pueden establecerse:

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

mpremote también puede instalar paquetes desde archivos almacenados en el sistema de archivos local del host:

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

Esto resulta especialmente útil para probar paquetes durante el desarrollo y para instalar paquetes desde clones locales de repositorios de GitHub. Ten en cuenta que las URL de los archivos package.json deben usar barras inclinadas («/») como separadores de directorios, incluso en Windows, para que sean compatibles con la instalación desde la web.

Instalación manual de paquetes

Los paquetes también pueden instalarse (en forma .py o .mpy) copiando manualmente los archivos al dispositivo. Según la placa, esto puede hacerse mediante almacenamiento masivo USB, la herramienta mpremote (p. ej. mpremote fs cp path/to/package.py :package.py), webrepl, etc.

Escritura y publicación de paquetes

Publicar en micropython-lib es la forma más fácil de hacer que tu paquete sea ampliamente accesible para los usuarios de MicroPython, y de que esté disponible automáticamente mediante mip y mpremote y compilado a bytecode. Consulta https://github.com/micropython/micropython-lib para más información.

Para escribir un paquete «autoalojado» que pueda descargarse con mip o mpremote, necesitas un servidor web estático (o GitHub) que aloje bien un único archivo .py, bien un archivo package.json junto a tus archivos .py.

Una biblioteca mlx90640 de ejemplo alojada en GitHub podría instalarse con:

$ mpremote mip install github:org/micropython-mlx90640

La disposición del paquete en GitHub podría tener este aspecto:

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

El package.json especifica la ubicación de los archivos que se van a instalar y otras dependencias:

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

La lista urls especifica los archivos que se van a instalar según:

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

donde destination_path es la ubicación y el nombre del archivo que se instalará en el dispositivo y source_url es la URL del archivo que se instalará. La URL de origen suele especificarse de forma relativa al directorio que contiene el archivo package.json, pero también puede ser una URL absoluta, p. ej.:

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

El paquete depende de collections-defaultdict y os-path, que se instalarán automáticamente desde micropython-lib. La tercera dependencia instala el contenido definido por el archivo package.json de la rama main del repositorio de GitHub org/micropython-additions.

Congelación de paquetes

Cuando un módulo o paquete de Python se importa desde el sistema de archivos del dispositivo, se compila a bytecode en RAM, listo para ser ejecutado por la VM. En el caso de un .mpy file, esta conversión ya se ha realizado, pero el bytecode sigue acabando en RAM.

Para dispositivos con poca memoria, o para aplicaciones grandes, puede ser ventajoso ejecutar en su lugar el bytecode desde ROM (es decir, memoria flash). Esto puede hacerse «congelando» el bytecode en el firmware de MicroPython, que luego se graba en el dispositivo. El rendimiento en tiempo de ejecución es el mismo (aunque la importación es más rápida), pero puede liberar cantidades significativas de RAM para que las use tu programa.

La desventaja de este enfoque es que el desarrollo es mucho más lento, porque tienes que grabar el firmware cada vez, pero aun así puede ser útil congelar dependencias que no cambian a menudo.

La congelación se realiza escribiendo un archivo de manifiesto y usándolo en la compilación, a menudo como parte de una definición de placa personalizada. Consulta la guía Archivos de manifiesto de MicroPython para más información.