July 12th 2019, 12:00:00 am
1. exec()
使用exec来执行Python导入模块的命令。
1 2 3
| module_name = "module01" exec("import " + module_name) module01.echo()
|
2. __import__()
单独使用__import__()
可以直接加载模块,但是当需要动态加载类、函数时,就需要配合getattr来实现。
实现步骤:
- 获取模块名(module_name)
- 使用
__import__(module_name)
导入Python模块
- 使用
getattr(module_name, class_name/function_name)
获取类、方法的对象
例子:
模块(module01.py)中包含一个Index类和一个echo方法。主程序(main.py)使用模块名动态调用其echo方法。
module01.py:
1 2 3 4
| class Index: def echo(self, content): print(self) print(content)
|
main.py:
1 2 3 4 5 6 7 8
| module_name = "module01" class_name = "Index" function_name = "echo"
module_object = __import__(module_name) module_class = getattr(module_object, class_name) module_class_object = module_class() module_class_object.echo("Hello World")
|
此外,还可以这样调用类中的函数:
main.py:
1 2 3 4 5 6 7 8 9 10
| module_name = "module01" class_name = "Index" function_name = "echo"
module_object = __import__(module_name) module_class = getattr(module_object, class_name) module_function = getattr(module_class, function_name) module_function("Hello World")
|
参考:
python 动态调用模块&类&方法
3. importlib
这种方式其实是__import__()
方式的扩展。Python官方文档推荐程序式地导入模块时应该使用 import_module() 而不是__import__
。
实现动态加载的方式与第二种类似:
module01.py
1 2 3 4
| class Index: def echo(self, content): print(self) print(content)
|
main.py
1 2 3 4 5 6 7 8
| import importlib
module_name = "module01" class_name = "Index"
module_object = importlib.import_module(module_name) module_class_object = module_object.Index() module_class_object.echo("Hello World")
|
(同样的这里可以配合getattr()使用)
使用importlib的一个好处就是还可以使用reload方法。在模块已经被导入的情况下,使用importlib.reload导入新的模块。
详情可见:importlib — import 的实现