모듈 구현하기¶
이 장에서는 MicroPython에서 핵심 모듈을 구현하는 방법을 자세히 다룹니다. MicroPython 모듈은 다음 중 하나일 수 있습니다:
내장 모듈: MicroPython 저장소의 일부인 일반 모듈입니다.
사용자 모듈: 자신의 저장소나 비공개 코드베이스에서 유지보수하는, 특정 프로젝트에 유용한 모듈입니다.
동적 모듈: 런타임에 기기에 배포하고 import할 수 있는 모듈입니다.
MicroPython의 모듈은 다음 위치 중 하나에 구현할 수 있습니다:
py/: 핵심 CPython 기능을 반영하는 핵심 라이브러리입니다.
extmod/: 여러 포트에 걸쳐 공유되는 CPython 또는 MicroPython 전용 모듈입니다.
ports/<port>/: 포트별 모듈입니다.
참고
이 장에서는 py/ 에 구현된 모듈, 즉 핵심 모듈에 대해 설명합니다. 외부 모듈 구현에 대한 자세한 내용은 C로 MicroPython 확장하기 을 참고하세요. 포트별 모듈에 대한 자세한 내용은 MicroPython 포팅하기 를 참고하세요.
핵심 모듈 구현하기¶
CPython과 마찬가지로 MicroPython에는 import 문을 통해 접근할 수 있는 핵심 내장 모듈이 있습니다. 한 가지 예가 메모리 관리 에서 다룬 gc 모듈입니다.
>>> import gc
>>> gc.enable()
>>>
MicroPython에는 io, array 등 여러 다른 내장 표준/핵심 모듈이 있습니다. 새 핵심 모듈을 추가하려면 여러 부분을 수정해야 합니다.
먼저 py/ 디렉터리에 C 파일을 만듭니다. 이 예시에서는 modsubsystem.c 파일에 가상의 새 모듈 subsystem 을 추가합니다:
#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
이 구현에는 모듈과 관련된 모든 함수의 정의가 포함되며, 그 함수들을 mp_module_subsystem_globals_table 에 있는 모듈의 전역 테이블에 추가합니다. 또한 mp_module_subsystem 으로 모듈 객체를 생성합니다. 그런 다음 모듈은 MP_REGISTER_MODULE 매크로를 통해 전체 시스템에 등록됩니다.
수정된 MicroPython을 빌드하고 실행하면 이제 모듈을 import할 수 있어야 합니다:
>>> import subsystem
>>> subsystem.info()
42
>>>
현재 info() 함수는 단일 숫자만 반환하지만 무엇이든 하도록 확장할 수 있습니다. 마찬가지로 이 새 모듈에 더 많은 함수를 추가할 수 있습니다.