Python - Import 机制
前言
你是否也会为 reload Python 的模块干到烦恼。
需要在不同的脚本加上 reload 导入的模块确保可以看到代码的更新。
Python 是怎么缓存 import 的模块的。
TLDR;
我后来了解了 Python 的加载机制之后弄了一个函数,只要将我们开发的包命名加上,就可以实现整个开发包 reload 。
1  | def module_cleanup(module_name):  | 
如果我们的 test_module 下有众多脚本就不需要逐个去添加 reload 了。
万一不小心把 reload 发布出去了也会稍微降低脚本运行的性能。
Python Import
https://docs.python.org/3/reference/import.html
上面是 Python 的官方文档讲述 Python的 import 的时候背后的运行机理,也可以切换成中文进行阅读。
这里我将上面的文章结合自己的实践总结一番。
Python import 模块可以用关键字
import或者importlib.import_module()
备注: 关键字调用无法放到 lambda 函数里面,这也是为什么 Python2 下默认
使用import关键字其实背后执行的是__import__()内置方法。
import 触发之后会从sys.modules查找缓存,找不到就从sys.path里面匹配模块 (这个过程也会触发 meta_path 等触发自定义的 import 行为)
找到匹配的模块就会创建模块 否则raise ModuleNotFoundError
生成的模块会放入到sys.modules进行缓存。
import 执行操作(不考虑自定义 import 情况)
- 从 
sys.modules查找模块缓存 - 从 
sys.path匹配脚本 生成模块 放入sys.modules缓存 
sys.modules
由于
sys.modules的缓存机制,Python 下次导入就从已经加载的缓存中获取模块,导致模块用的还是旧的代码逻辑。
相应的也可以修改 sys.modules 的字典实现骚操作
1  | import sys  | 
当然这种骚操作不推荐使用就是了。...
剩余内容已隐藏