0.说明
模块是用来组织Python代码方法的方法,而包则是用来组织模块的,充分利用好包和模块将有利于开发出结构清晰的大型程序。
1.什么是模块
所谓模块,其实就是一个包含了特定功能代码的.py文件,在这个.py文件中,主要有如下的代码类型:
- 包含数据成员和方法的类
- 一组相关但彼此独立的操作函数
- 全局变量
使用import语句就可以导入一个模块中的相关属性。
2.模块和文件
模块是按照逻辑上来组织Python代码的方法,而体现在物理层面上,它就是一个文件,因此,一个文件被看作是一个独立模块,一个模块也可以被看作是一个文件。模块的文件名就是模块的名字加上扩展名.py。
与其他可以导入类的语言不同,在Python中导入的是模块或模块属性。
(1)模块名称空间
名称空间是Python非常重要的一个概念,所谓名称空间,其实指的是一个名称到对象的关系映射集合。可以因为每个模块都定义了它自己的唯一的名称空间,所以不同模块间不会出现名称交叉现象,通过句点属性的访问方式,即使两个模块里有相同名称的变量,由于模块名称的不同,也不会发生名称冲突。
(2)搜索路径和路径搜索
模块的导入(使用import语句)需要一个叫做“路径搜索”的过程,即在文件系统“预定义区域”中查找要导入的模块文件,而这些预定义区域其实是Python搜索路径的集合,这里需要注意下面两个概念:
- 路径搜索:指查找某个文件的操作,是动词
- 搜索路径:需要查找的一组目录,是名词
如果模块名称不在搜索路径中,就会触发ImportError异常:
>>> import mymodules Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named mymodules
而默认搜索路径是在编译或安装时指定的,可以在两个地方修改:
- 设置环境变量PYTHONPATH
- 在sys.path中添加搜索路径
启动Python解释器后,搜索路径会被保存在sys模块的sys.path变量中:
>>> import sys >>> sys.path [‘‘, ‘/usr/local/lib/python2.7/dist-packages/pip-8.0.2-py2.7.egg‘, ‘/usr/local/lib/python2.7/dist-packages/setuptools-3.3-py2.7.egg‘, ‘/usr/lib/python2.7‘, ‘/usr/lib/python2.7/plat-x86_64-linux-gnu‘, ‘/usr/lib/python2.7/lib-tk‘, ‘/usr/lib/python2.7/lib-old‘, ‘/usr/lib/python2.7/lib-dynload‘, ‘/usr/local/lib/python2.7/dist-packages‘, ‘/usr/lib/python2.7/dist-packages‘, ‘/usr/lib/python2.7/dist-packages/PILcompat‘, ‘/usr/lib/python2.7/dist-packages/gtk-2.0‘, ‘/usr/lib/python2.7/dist-packages/ubuntu-sso-client‘]
返回的是一个列表,第一个元素表示的是当前目录。可以通过向这个列表添加元素(使用append或insert)来增加搜索路径:
>>> import my Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named my >>> sys.path.append(‘/home/xpleaf/test‘) >>> import my
如果有多个相同的模块名称,Python解释器会使用沿着搜索路径顺序找到的第一个模块。
另外使用sys.modules可以找到当前导入了哪些模块和它们来自什么地方,如下:
>>> sys.modules {‘copy_reg‘: <module ‘copy_reg‘ from ‘/usr/lib/python2.7/copy_reg.pyc‘>, ‘sre_compile‘: <module ‘sre_compile‘ from ‘/usr/lib/python2.7/sre_compile.pyc‘>,...}
可以看到,与sys.path不同,sys.modules返回的是一个字典,其中key为模块的名称,键值为模块的路径。