แพ็กเกจ importlib ให้การนำไปปฏิบัติของคำสั่ง import ในซอร์สโค้ด Python ที่เคลื่อนย้ายได้ไปยังอินเตอร์พรีเตอร์ Python ใดๆ นี่ยังให้การนำไปปฏิบัติที่เข้าใจง่ายกว่าการนำไปปฏิบัติในภาษาโปรแกรมมิ่งอื่นนอกจาก Python
แพ็กเกจนี้ยังเปิดเผยส่วนประกอบเพื่อนำเข้า ทำให้ง่ายขึ้นสำหรับผู้ใช้ในการสร้างออบเจกต์แบบกำหนดเองของตนเอง (ที่เรียกว่า importer) เพื่อเข้าร่วมในกระบวนการนำเข้า
แพ็กเกจ importlib มีฟังก์ชันสำคัญชื่อ import_module()
import_module():
ฟังก์ชันนี้นำเข้าโมดูลทางโปรแกรม ชื่อโมดูลเป็นพารามิเตอร์แรกของฟังก์ชัน พารามิเตอร์ที่สองเป็นตัวเลือก ระบุชื่อแพ็กเกจหากมี
invalidate_caches():
ฟังก์ชันนี้ทำให้แคชภายในของ finders ไม่ถูกต้อง ควรเรียกฟังก์ชันนี้หากมีโมดูลถูกสร้าง/ติดตั้งขณะที่โปรแกรมของคุณกำลังทำงาน เพื่อรับประกันว่า finders ทั้งหมดจะสังเกตเห็นการมีอยู่ของโมดูลใหม่
reload():
ฟังก์ชันนี้โหลดโมดูลที่นำเข้าไว้ก่อนหน้านี้ใหม่ นี่มีประโยชน์หากคุณแก้ไขไฟล์ซอร์สโมดูลโดยใช้เอดิเตอร์ภายนอกและต้องการลองเวอร์ชันใหม่โดยไม่ต้องออกจากอินเตอร์พรีเตอร์ Python
ตัวอย่าง:
สร้างสคริปต์ Python สองไฟล์ชื่อ module1.py และ module2.py ที่มีโค้ดเหมือนกันดังนี้:
# module1
def main():
print('module imported', __name__)
return
if __name__ == '__main__':
main()
ตอนนี้นำเข้าโมดูลเหล่านี้แบบไดนามิกโดยใช้แพ็กเกจ importlib:
>> import importlib
>>> mod = importlib.import_module('module1')
>>> mod.__name__
'module1'
>>> mod = importlib.import_module('module2')
>>> mod.__name__
'module2'
>>> mod.main()
module imported module2
>>>
แพ็กเกจ importlib มีโมดูลย่อยดังนี้:
importlib.abc
โมดูลนี้มีคลาสฐานนามธรรมหลักทั้งหมดที่ใช้โดย import โมดูลย่อยบางส่วนของคลาสฐานนามธรรมหลักก็ถูกให้มาช่วยในการนำไปปฏิบัติ ABCs หลัก
importlib.resources
โมดูลนี้ใช้ระบบ import ของ Python เพื่อให้การเข้าถึงทรัพยากรภายในแพ็กเกจ
importlib.machinery
โมดูลนี้มีออบเจกต์ต่างๆ ที่ช่วยให้ import ค้นหาและโหลดโมดูล
importlib.util
โมดูลนี้มีโค้ดยูทิลิตี้สำหรับ importers มีออบเจกต์ต่างๆ ที่ช่วยในการสร้าง importer ฟังก์ชันสำคัญต่อไปนี้ถูกกำหนดไว้:
find_spec():
ฟังก์ชันนี้ค้นหาข้อกำหนดสำหรับโมดูล เกี่ยวกับชื่อแพ็กเกจที่ระบุ หาก name เป็นสำหรับโมดูลย่อย (มีจุด) โมดูลพาเรนต์จะถูกนำเข้าโดยอัตโนมัติ Name และ package ทำงานเหมือนกับ import_module()
module_from_spec(spec)
สร้างโมดูลใหม่โดยอิงจาก spec และ spec.loader.create_module
ตัวอย่าง:
import importlib.util
def check_module(mod):
spec = importlib.util.find_spec(mod)
if spec is None:
print('Module: {} not found'.format(mod))
return None
else:
print('Module: {} can be imported!'.format(mod))
return spec
def import_module(spec):
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
if __name__ == '__main__':
spec = check_module('notamodule')
spec = check_module('module1')
if spec:
mod = import_module(spec)
mod.main()
ผลลัพธ์:
Module: notamodule not found Module: module1 can be imported! module imported module1