第十章模块与包( 通过字符串名导入模块)
通过字符串名导入模块
问题
你想导入一个模块,但是模块的名字在字符串里。你想对字符串调用导入命令。
解决方案
使用 importlib.import_module() 函数来手动导入名字为字符串给出的一个模块或者包的一部分。举个例子:
import importlib math = importlib.import_module('math') print(math.sin(2)) # 0.9092974268256817 mod=importlib.import_module('urllib.request') u=mod.urlopen('https://www.python.org')
import_module 只是简单地执行和 import 相同的步骤,但是返回生成的模块对象。你只需要将其存储在一个变量,然后像正常的模块一样使用。
如果你正在使用的包,import_module() 也可用于相对导入。但是,你需要给它一个额外的参数。
假设有个包mypackage,里面含有三个文件分别是:__init__.py、bar.py、foo.py,可以用绝对路径导入模块bar.py和foo.py。例如:
import importlib importlib.import_module('mypackage.bar') #绝对导入模块 importlib.import_module('.foo','mypackage') #相对导入模块
使用 import_module() 手动导入模块的问题通常出现在以某种方式编写修改或覆盖模块的代码时候。例如,也许你正在执行某种自定义导入机制,需要通过名称来加载一个模块,通过补丁加载代码。