Implémenter un module#

Ce chapitre détaille comment implémenter un module de base dans MicroPython. Les modules MicroPython peuvent être de l’un des types suivants :

  • Module intégré : un module général qui fait partie du dépôt MicroPython.

  • Module utilisateur : un module utile à votre projet spécifique, que vous maintenez dans votre propre dépôt ou base de code privée.

  • Module dynamique : un module pouvant être déployé et importé à l’exécution sur votre appareil.

Un module dans MicroPython peut être implémenté à l’un des emplacements suivants :

  • py/ : une bibliothèque de base qui reflète les fonctionnalités de base de CPython.

  • extmod/ : un module spécifique à CPython ou à MicroPython partagé entre plusieurs portages.

  • ports/<port>/ : un module spécifique à un portage.

Note

Ce chapitre décrit les modules implémentés dans py/ ou les modules de base. Consultez Étendre MicroPython en C pour plus de détails sur l’implémentation d’un module externe. Pour plus de détails sur les modules spécifiques à un portage, consultez Portage de MicroPython.

Implémenter un module de base#

Comme CPython, MicroPython dispose de modules intégrés de base accessibles via des instructions d’import. Un exemple est le module gc abordé dans Gestion de la mémoire.

>>> import gc
>>> gc.enable()
>>>

MicroPython possède plusieurs autres modules standard/de base intégrés tels que io, array, etc. L’ajout d’un nouveau module de base implique plusieurs modifications.

Tout d’abord, créez le fichier C dans le répertoire py/. Dans cet exemple, nous ajoutons un nouveau module hypothétique subsystem dans le fichier modsubsystem.c :

#include "py/builtin.h"
#include "py/runtime.h"

#if MICROPY_PY_SUBSYSTEM

// info()
static mp_obj_t py_subsystem_info(void) {
    return MP_OBJ_NEW_SMALL_INT(42);
}
MP_DEFINE_CONST_FUN_OBJ_0(subsystem_info_obj, py_subsystem_info);

static const mp_rom_map_elem_t mp_module_subsystem_globals_table[] = {
    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_subsystem) },
    { MP_ROM_QSTR(MP_QSTR_info), MP_ROM_PTR(&subsystem_info_obj) },
};
static MP_DEFINE_CONST_DICT(mp_module_subsystem_globals, mp_module_subsystem_globals_table);

const mp_obj_module_t mp_module_subsystem = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t *)&mp_module_subsystem_globals,
};

MP_REGISTER_MODULE(MP_QSTR_subsystem, mp_module_subsystem);

#endif

L’implémentation comprend une définition de toutes les fonctions liées au module et ajoute les fonctions à la table globale du module dans mp_module_subsystem_globals_table. Elle crée également l’objet module avec mp_module_subsystem. Le module est ensuite enregistré auprès du système global via la macro MP_REGISTER_MODULE.

Après avoir compilé et exécuté le MicroPython modifié, le module devrait maintenant être importable :

>>> import subsystem
>>> subsystem.info()
42
>>>

Notre fonction info() ne renvoie actuellement qu’un seul nombre, mais elle peut être étendue pour faire n’importe quoi. De même, d’autres fonctions peuvent être ajoutées à ce nouveau module.