Python 模块动态加载

这篇博客的缘由是在stackoverflow上回答的一个相关问题

为什么要引入动态加载

假如我们有如下的一个main函数

in main.py

import Command1
import Command2
...
import CommandN

if __name__ == '__main__':
    if condition1:
        Command1.run()
    elif:
        Command2.run()
    ...
    else:
        CommandN.run()

我们需要根据一定的条件调用某模块下的函数,但是我们只需要其中的一部分。在这种情况下,把其它模块均加载进去并非有必要。动态加载可以解决这个问题。

引入动态加载的方式 __import__

__import__是python内建函数,它允许用户输入字符串,然后查找对应名称的模块并返回。 例如:

sys = __import__('sys')

import sys

得到的sys是一致的。

然而,当模块中包含多个'.‘的时候,(如'foo.foo1.Command1'),那么简单使用 import 不能正确解析模块,原因在于 import 会将第一个逗号后面的内容视为模块名称。

关于这一问题有下面两种解决方法:

  1. 使用fromlist参数:

    import(“foo.foo1.Command1”, fromlist=[“foo.foo1”])

  2. 使用importlib模块:

    import importlib importlib.import_module(“foo.foo1.Command1”)