赞
踩
python中动态加载模块主要有这几种方法:使用系统函数__import__();使用imp模块, 在3.4版本后弃用了,使用importlib代替;使用importlib模块;使用exec函数。而加载类和方法需要在加载模块后从模块中获取。下面分别介绍一下这几种方法。
使用__import__函数不需要额外引入其他包。直接上代码
importlib.import_module(name, package=None)
导入一个模块。参数 name 指定了以绝对或相对导入方式导入什么模块 (比如要么像这样 pkg.mod 或者这样 …mod)。如果参数 name 使用相对导入的方式来指定,那么那个参数 packages 必须设置为那个包名,作为解析这个包的锚点 (比如 import_module(’…mod’, ‘pkg.subpkg’) 将会导入 pkg.mod)。
import_module和__import__这两个函数之间最重要的区别是 import_module() 返回指定的包或模块(例如 pkg.mod),而 import() 返回顶级包或模块(例如 pkg)。
importlib.reload(module)
importlib还可以重新加载之前已经导入的module。参数为一个模块对象,在reload之前已经成功导入了。更详细的信息从官方文档了解:https://docs.python.org/3.7/library/importlib.html#importlib.reload
直接看代码吧。
测试代码:
#import imp import importlib def test_import(): module_name = "class_define" my_module = __import__(module_name) print("test_import imported module: ", my_module) print("test_import module: ", dir(my_module)) class_name = "MyClass" class_ = getattr(my_module, class_name) print("test_import get class: ", class_) obj = class_() #for attr in dir(obj): print("test_import obj attr: ", dir(obj)) def test_import_class(): module_name = "class_define" class_name = "MyClass" my_module = __import__(module_name, globals(), locals(), fromlist=[class_name]) print("test_import_class imported module: ", my_module) print("test_import_class module: ", dir(my_module)) def test_importlib(): module_name = "class_define" class_name = "MyClass" my_module = importlib.import_module(".", module_name) print("test_importlib imported module: ", my_module) print("test_importlib module: ", dir(my_module)) importlib.reload(my_module) def test_exec(): lo = locals() module_name = "class_define" class_name = "MyClass" import_str = "import {}".format(module_name) my_module = exec(import_str) print("test_exec imported module: ", lo[module_name]) print("test_exec module: ", dir(lo[module_name])) if __name__ == "__main__": test_import() test_import_class() test_importlib() test_exec()
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。