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.