您的位置:首页 > 编程语言 > Python开发

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环境中的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: