1. 使用场景
有时候希望从配置文件或者其他字符串等中获取要被动态加载module,但是字符串类型的数据是无法用import导入,如
>>>import 'math'
File "<input>", line 1
import 'math'
^
SyntaxError: invalid syntax
遇到如此场景,使用__import__来解决,示例:
>>>__import__('math')
<module 'math' (built-in)>
2. __import__
Python 提供内建函数 import 动态加载 module,import 的用法如下:
__import__ (name[, globals[, locals[, fromlist[, level]]]])
- name (required): 被加载 module 的名称
- globals (optional): 包含全局变量的字典,该选项很少使用,采用默认值 global()
- locals (optional): 包含局部变量的字典,内部标准实现未用到该变量,采用默认值 local()
- fromlist (Optional): 被导入的 submodule 名称
- level (Optional): 导入路径选项,默认为 -1,表示同时支持 absolute import 和 relative import
使用示例:
>>>math_module = __import__('math')
>>>math_module.log(2)
0.6931471805599453
3. import本质
import本质上是调用__import__加载module的,示例:
import math
本质是调用如下函数实现
math =__import__('math',globals(), locals(), [], -1)
4. __import__坑点
__import__并不支持class, object的动态导入,只支持module的动态导入。示例:
两者导入的都是os模块
__import__('os')
<module 'os' from 'C:\\Anaconda3\\envs\\showtools\\lib\\os.py'>
__import__('os.path')
<module 'os' from 'C:\\Anaconda3\\envs\\showtools\\lib\\os.py'>
动态导入class, object:可以采用openstack的 oslo.utils