このドキュメンテーションは、MicroPython の最新開発ブランチのためのものです。 リリースバージョンでは利用できない機能に言及することがあります。

特定のリリースのドキュメントをお探しの場合は、左側のドロップダウンメニューを使って、 望みのバージョンを選択します。

モジュールの実装方法

この章では、MicroPython でコアモジュールを実装する方法について説明します。MicroPython のモジュールは、以下のいずれかになります:

  • 組込みモジュール: MicroPython リポジトリの一部である汎用モジュールです

  • ユーザーモジュール: 特定のプロジェクトに役立つモジュールで、自分のリポジトリまたはプライベートコードベースで管理します。

  • ダイナミックモジュール: 実行時にデバイスにデプロイしてインポートできるモジュールです。

MicroPython のモジュールは次のいずれかの場所に実装できます:

  • py/: CPythonのコア機能を反映したコアライブラリです。

  • extmod/: 複数のポートで共有される CPython または MicroPython 固有のモジュールです。

  • ports/<port>/: ポートに固有のモジュールです。

注釈

この章では py/ またはコアモジュールで実装されたモジュールについて説明します。外部モジュールの実装については C言語による MicroPython の拡張 を参照してください。ポート専用モジュールの詳細については MicroPythonの移植 を参照してください。

コアモジュールの実装方法

CPython と同様に、MicroPython にもコアとなる組込みモジュールがあり、import 文でアクセスできます。例として、 メモリー管理 で取り上げた gc モジュールの場合について示します。

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

MicroPython には、他にも ioarray などの標準/コアモジュールがいくつか組み込まれています。新しいコアモジュールの追加にはいくつかの修正が必要です。

まず、 py/ ディレクトリに C ファイルを作成します。この例では odsubsystem.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 subsystem
>>> subsystem.info()
42
>>>

info() 関数は現在のところ1つの数値を返すだけですが、他にも何かできるように拡張できます。同様にして、より多くの関数をこの新しいモジュールに追加できます。