การดำเนินการโมดูล¶
บทนี้อธิบายรายละเอียดวิธีดำเนินการโมดูลหลักใน MicroPython โมดูล MicroPython สามารถเป็นหนึ่งในประเภทต่อไปนี้:
โมดูล Built-in: โมดูลทั่วไปที่เป็นส่วนหนึ่งของที่เก็บข้อมูล MicroPython
โมดูลผู้ใช้: โมดูลที่มีประโยชน์สำหรับโปรเจกต์เฉพาะของคุณที่คุณดูแลในที่เก็บข้อมูลของตัวเองหรือ codebase ส่วนตัว
โมดูล Dynamic: โมดูลที่สามารถนำไปใช้และนำเข้าได้ที่ runtime บนอุปกรณ์ของคุณ
โมดูลใน MicroPython สามารถดำเนินการได้ในหนึ่งในตำแหน่งต่อไปนี้:
py/: ไลบรารีหลักที่สะท้อนฟังก์ชันการทำงานหลักของ CPython
extmod/: โมดูลเฉพาะ CPython หรือ MicroPython ที่แชร์ข้ามพอร์ตหลายรายการ
ports/<port>/: โมดูลเฉพาะพอร์ต
Note
บทนี้อธิบายโมดูลที่ดำเนินการใน py/ หรือโมดูลหลัก ดู การขยาย MicroPython ด้วย C สำหรับรายละเอียดการดำเนินการโมดูลภายนอก สำหรับรายละเอียดเกี่ยวกับโมดูลเฉพาะพอร์ต ดู การพอร์ต MicroPython
การดำเนินการโมดูลหลัก¶
เช่นเดียวกับ CPython, MicroPython มีโมดูล builtin หลักที่สามารถเข้าถึงได้ผ่าน import statements ตัวอย่างคือโมดูล gc ที่กล่าวถึงใน การจัดการหน่วยความจำ
>>> import gc
>>> gc.enable()
>>>
MicroPython มีโมดูลมาตรฐาน/หลัก builtin อื่น ๆ อีกหลายตัวเช่น io, array เป็นต้น การเพิ่มโมดูลหลักใหม่เกี่ยวข้องกับการปรับเปลี่ยนหลายอย่าง
ขั้นแรก สร้างไฟล์ 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);
#endif
การดำเนินการรวมถึงนิยามของฟังก์ชันทั้งหมดที่เกี่ยวข้องกับโมดูลและเพิ่มฟังก์ชันไปยังตารางทั่วโลกของโมดูลใน mp_module_subsystem_globals_table นอกจากนี้ยังสร้างอ็อบเจกต์โมดูลด้วย mp_module_subsystem โมดูลจะถูกลงทะเบียนกับระบบที่กว้างกว่าผ่าน macro MP_REGISTER_MODULE
หลังจากสร้างและรัน MicroPython ที่ปรับเปลี่ยนแล้ว โมดูลควรนำเข้าได้ตอนนี้:
>>> import subsystem
>>> subsystem.info()
42
>>>
ฟังก์ชัน info() ของเราตอนนี้คืนค่าเพียงตัวเลขเดียว แต่สามารถขยายให้ทำอะไรก็ได้ ในทำนองเดียวกัน สามารถเพิ่มฟังก์ชันเพิ่มเติมในโมดูลใหม่นี้ได้