Python 动态创建模块

1. 使用 types.ModuleType

几乎 Python 中所有的东西都是对象, Python 标准库 types 提供了 build-in 对象的类型. 我们需要 types.ModuleType 来动态创建 module.

import types

hello = types.ModuleType("hello")

现在我们创建了一个空白的模块, 现在我们可以创建一个函数并将函数加入到 hello 模块中.

def say_hello():
    print("hello")

setattr(hello, "say_hello", say_hello)

现在可以通过 hello.say_hello 来调用 say_hello

hello.say_hello()

2. import 模块

以上动态创建的模块 hello, 并不能通过 import hello 的方式使用.

import hello
ModuleNotFoundErrorTraceback (most recent call last)
in
----> 1 import hello

ModuleNotFoundError: No module named 'hello'

Python 的 import 机制很简明, sys.modules 在其中是关键点.

当我们使用 import hello 的时候, Python 解析器会在 sys.modules 字典中查找 key 为 'hello' 的值. 如果 key 存在, 返回已经被初始化的模块.

如果 key 不存在的话, Python 解析器会遍历 PYTHONPATH 中的文件系统, 寻找名字为 hello 的文件或者模块, 如果找到的话初始化 hello 并注册到 sys.modules 中, 否则抛出 ImportError 异常.

Generated using Emacs 29.0.50 (Org mode 9.4.6)