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) |
Python 的 import 机制很简明, sys.modules
在其中是关键点.
当我们使用 import hello
的时候, Python 解析器会在 sys.modules
字典中查找 key 为 'hello' 的值.
如果 key 存在, 返回已经被初始化的模块.
如果 key 不存在的话, Python 解析器会遍历 PYTHONPATH 中的文件系统, 寻找名字为 hello 的文件或者模块,
如果找到的话初始化 hello 并注册到 sys.modules 中, 否则抛出 ImportError
异常.