ch21模块:宏伟蓝图(python)

模块是高级别的程序组织单元,将程序代码和数据封装起来以便重用

模块一般对英语python文件(或者用外部语言比如C语言等写成的扩展)

模块可以用两个语句和一个重要的内置函数处理
import
from
imp.reload

模块内容:
reload
__name__和__all__属性
封装import
相对导入语法

模块和类实际上就是一个重要的命名空间


为什么使用模块:
代码重用:
系统命名空间的划分:
实现共享服务和数据


#python程序结构
程序由一个主体的顶层文件和多个模块文件构成
导入一个模块,则可以将该模块的工具,变量,函数当作模块属性用


#导入和属性
a.py 顶层文件
b.py和c.py  模块文件


### file: b.py

def spam(text):
    print(text, 'spam')


#a想要使用spam,必须导入模块b
### file: a.py

import b
b.spam('gumby')

#标准库模块
查看标准库手册


# NOTE: described but not shown explicitly in the book:
C:\misc> a.py
gumby spam



### fileL: C:\Python30\pydirs.pth
c:\pycode\utilities
d:\pycode\package1



>>> import sys
>>> sys.path
['', 'C:\\users', 'C:\\Windows\\system32\\python30.zip', 'c:\\Python30\\DLLs',
'c:\\Python30\\lib', 'c:\\Python30\\lib\\plat-win', 'c:\\Python30',
'C:\\Users\\Mark', 'c:\\Python30\\lib\\site-packages']



#import如何工作
#程序第一次导入指定文件的时,会执行三个步骤:
1:找到模块文件
2:编译成字节码(需要时)
3:执行模块的代码来创建其所定义的对象
上面的步骤只在程序第一次导入才会进行


#python把载入的模块存储到一个名为sys.modules的字典中,有导入操作都会查询该字典



1:搜索 python使用标准库模块搜索路径来找出import语句所对应的模块文件
2:编译(可选)
编译成字节码
__name__ 和__main__ 可以确保文件是顶层文件同时可以作为被导入模块
3:执行模块的字节码


#模块搜索路径
#sys.path的组成有:
1:程序主目录
2:PYTHONPATH环境变量
3:标准库目录
4:.pth文件的内容

#程序主目录是顶层文件所在的目录,或者在交互模式下是你当前工作的目录

#PYTHONPATH环境变量列出的目录,

#标准库目录,接下来python搜索标准库模块的安装目录

#.pth文件,在该文件中添加模块目录,python会自动搜索添加到sys.path中
.pth在win下可存放于python安装目录(比如c:\Python30)或者标准库所在位置的sitepackages子目录中(c:\Python30\LIb\sitepackages\)
.pth在linux下可存放于usr/local/lib/python3.0/sitepackages或/usr/local/lib/site-python


#配置搜索路径


#搜索路径的变动


#sys.path列表
#sys.path是模块的搜索路径。python启动时,将顶级文件的主目录(或者指定当前工作目录的一个空字符串),任何PYTHONPATH目录,已经创建的任何.pth文件中的路径内容,以及标准库目录合并。
sys.path.append(dirname)

#模块文件选择
源代码文件 b.py
字节码文件 b.pyc
目录b,包导入(23章说明)
编译扩展模块(通常用C或C++编写),导入时使用动态链接(比如linux的b.so以及Cygwin和win的b.dll和b.pyd)
用C编写的编译好的内置模块,并通过静态连接至python
zip文件,导入时会自动解压缩
内存内映射,对于frozen可执行文件
Java类,在Jython版本的python中
.Net组件,在IronPython版本中的python中

#对客户端透明



#高级的模块选择概念
重新定义Python中import操作所做的事也是可能的,也就是所谓的导入钩子(import hook)。
这些钩子可以让导入做各种有用的事,例如,从归档文件中加载,执行解密。
python的这些钩子让文件可直接从zip文件库中导入,在导入时会自动解压缩zip文件。参考内置函数__import__,这个函数是实际执行的import语句的可定制工具

python支持最佳化字节码文件.pyo,比普通的.pyc文件快5%

#python的第三方扩展,通常使用标准库中的distutils工具来自动安装,所以不需要路径设置,就能使用他们的代码。使用distutils的系统一般都附带setup.py脚本。
setup.py导入并使用了distutils模块,将这种系统放在属于模块自动搜索路径一部分的目录内(通常是在python安装目录树下的Lib\site-packages子目录中)

评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用