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