实现一个模块¶
本章详细介绍了如何在 MicroPython 中实现一个核心模块。MicroPython 模块可以是以下之一:
内置模块:属于 MicroPython 存储库一部分的通用模块。
用户模块:对您在自己的存储库或私有代码库中维护的特定项目有用的模块。
动态模块:可以在运行时部署和导入设备的模块。
MicroPython 中的模块可以在以下位置之一实现:
py/: 一个反映核心 CPython 功能的核心库。
extmod/: 跨多个端口共享的 CPython 或 MicroPython 特定模块。
端口/<端口>/:特定于端口的模块。
笔记
本章介绍在 py/
或核心模块中实现的模块。有关实现外部模块的详细信息,请参阅用 C 扩展 MicroPython 。有关特定于端口的模块的详细信息,请参阅 移植 MicroPython。
实现核心模块¶
与 CPython 一样,MicroPython 具有可以通过 import 语句访问的核心内置模块。一个例子是gc
内存管理中讨论的模块。
>>> import gc
>>> gc.enable()
>>>
MicroPython有几个其他内置标准/核心模块喜欢 io
, uarray
等添加一个新的核心模块包括几个修饰。
首先, C
在 py/
目录中创建文件。在这个例子中,我们subsystem
在文件中添加了一个假设的新模块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, MICROPY_PY_SUBSYSTEM);
#endif
该实现包括与模块相关的所有函数的定义,并将函数添加到模块的全局表中 mp_module_subsystem_globals_table
。它还使用mp_module_subsystem
. 然后通过 MP_REGISTER_MODULE
宏将模块注册到更广泛的系统。
构建并运行修改后的 MicroPython 后,该模块现在应该是可导入的:
>>> import subsystem
>>> subsystem.info()
42
>>>
我们的info()
函数目前只返回一个数字,但可以扩展为做任何事情。同样,可以向这个新模块添加更多功能。