Python中模块的动态加载机制
2015-04-20 21:35
453 查看
1.Python运行时全局module pool机制
sys.modules 是一个字典,它包含了从Python 开始运行起,被导入的所有模块。键字就是模块名,键值就是模块对象。请注意除了你的程序导入的模块外还有其它模块。Python 在启动时先装入了一些模块,如果你在一个Python
IDE 环境下,sys.modules 包含你在IDE 中运行的所有程序所导入的所有模块。初始化时预先加载到内存的module 和被动态加载的用户自定义module都存放在sys.modules中,sys.modules就是Python系统的module集中营。module对象内部实际上是通过一个dict维护所有的(属性,属性值)。
import并不完全等同于我们所熟知的“动态加载”的概念,它的真实韩图是希望某个 module能够被感知,即是将这个module以某个符号的形式引入到某个名字空间。如果import等于动态加载,python将对同一个module执行多次动态加载,并且在内存中保存一个module的多个映像,显然不科学
所以Python引入了全局的module集合-sys.modules,这个集合作为module pool,保存了module的唯一映像,当某个.py 文件通过import声明希望感知到某个module时,Python将在这个pool 中查找。如果该module已经存在于pool中,则引入一个符号到该.py文件的名字空间里,并将其关联到该module,使这个module透过这个符号能够被.py文件感知;否则才执行动态加载
2.module路径的树状结构
1 导入模块时,不带模块的后缀名,比如.py Python搜索模块的路径:
1)、程序的主目录
2)、PTYHONPATH目录(如果已经进行了设置)
3)、标准连接库目录(一般在/usr/local/lib/python2.X/)
4)、任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去
.pth后缀的文本文件中一行一行的地列出目录。
这四个组建组合起来就变成了sys.path了
如果说module是一种管理class的机制那么package就是一种管理module的机制,更进一步.多个较小的package可以聚合成较大的package,在这个package中.,多个module,package最终组织成了一个树形的结构
Python对x.y.z的import 操作实际上是沿者树状结构一层一层地展开来的,可以看作是对树状结构的遍历操作。我们可以将x.y.z看做是一个二叉树的遍历的轨迹,其中在遍历的过程中,我们只访问其右子树
可以将所有的import动作都归一到同一个抽象原则下:,当Python虚拟机import module 或者package时候,都会创建一个module对象,并且设置其__name__和__path__。Python中的import动作都是发生在某个package环境中的
sys.modules 是一个字典,它包含了从Python 开始运行起,被导入的所有模块。键字就是模块名,键值就是模块对象。请注意除了你的程序导入的模块外还有其它模块。Python 在启动时先装入了一些模块,如果你在一个Python
IDE 环境下,sys.modules 包含你在IDE 中运行的所有程序所导入的所有模块。初始化时预先加载到内存的module 和被动态加载的用户自定义module都存放在sys.modules中,sys.modules就是Python系统的module集中营。module对象内部实际上是通过一个dict维护所有的(属性,属性值)。
import并不完全等同于我们所熟知的“动态加载”的概念,它的真实韩图是希望某个 module能够被感知,即是将这个module以某个符号的形式引入到某个名字空间。如果import等于动态加载,python将对同一个module执行多次动态加载,并且在内存中保存一个module的多个映像,显然不科学
所以Python引入了全局的module集合-sys.modules,这个集合作为module pool,保存了module的唯一映像,当某个.py 文件通过import声明希望感知到某个module时,Python将在这个pool 中查找。如果该module已经存在于pool中,则引入一个符号到该.py文件的名字空间里,并将其关联到该module,使这个module透过这个符号能够被.py文件感知;否则才执行动态加载
2.module路径的树状结构
1 导入模块时,不带模块的后缀名,比如.py Python搜索模块的路径:
1)、程序的主目录
2)、PTYHONPATH目录(如果已经进行了设置)
3)、标准连接库目录(一般在/usr/local/lib/python2.X/)
4)、任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去
.pth后缀的文本文件中一行一行的地列出目录。
这四个组建组合起来就变成了sys.path了
如果说module是一种管理class的机制那么package就是一种管理module的机制,更进一步.多个较小的package可以聚合成较大的package,在这个package中.,多个module,package最终组织成了一个树形的结构
Python对x.y.z的import 操作实际上是沿者树状结构一层一层地展开来的,可以看作是对树状结构的遍历操作。我们可以将x.y.z看做是一个二叉树的遍历的轨迹,其中在遍历的过程中,我们只访问其右子树
可以将所有的import动作都归一到同一个抽象原则下:,当Python虚拟机import module 或者package时候,都会创建一个module对象,并且设置其__name__和__path__。Python中的import动作都是发生在某个package环境中的
相关文章推荐
- Python模块的动态加载机制
- Python模块的动态加载机制
- Python模块的动态加载机制
- Python模块的动态加载机制
- python动态加载模块、类、函数
- Python动态加载模块的实现
- python技巧31[Python 动态加载模块的3种方法]
- Python 动态加载模块的3种方法
- python动态加载子模块 根据字符串绑定子模块 如加载os.path
- 动态加载python可执行模块的办法(示例代码)
- 看书 Python 源码分析笔记 (十一) 模块加载机制
- Python动态加载模块以及模块类列表获取
- python技巧31[Python 动态加载模块的3种方法]
- python - 动态加载模块和类
- Python动态加载模块的3种方法
- Python动态加载模块的3种方法
- python动态加载模块
- python模块与包加载机制
- Python的动态加载机制
- Python动态加载模块