一、模块
在python中,模块就是一个代码文件,模块中可以定义类、函数、变量,也可以包含可执行的代码。
使用Import导入。
1.1 搜索路径
搜索模块时,python会按照sys.path列表中的路径,依次进行搜索。可以通过sys.path查看搜索路径。
将模块的路径添加到sys.path路径的三种方法:
(1)动态添加
sys.path.append(模块路径),动态添加需要每次在程序启动时,向sys.path添加。
(2)若经常用到,可以在Python安装目录下的Lib\site-packages文件夹下建立一个纯文本文件,扩展名为.path。
(3)修改环境变量。
1.2 导入模块
可以一次导入多个模块
1.3 导入指定的模块属性
如:from xlutils.copy import copy
1.4 加载模块
在程序开发中,一个模块可以在多处被import,但Python只会导入一次,因为所有加载到内存的模块都会被放入到sys.modules中。
加载模块会导致这个模块被“执行”。
1.5 名称空间
Python程序执行时存在内建名称空间、全局名称空间和局部名称空间。
1.6 “编译”的Python文件
Python中一旦被引用的模块(假设为example.py)被成功编译,其对应的编译版本example.pyc就会被创建。如果创建成功,那么example.py的修改时间会记录在example.pyc中,下次载入时,如果两个文件的修改时间不匹配,则.pyc文件就会被忽略。如果有可用的.pyc文件,则会使用.pyc文件提高模块的加载速度。当程序需要加载多个模块时,.pyc文件能够有效地提高程序的启动速度。
1.7 自动导入模块
sys模块的modules变量中存储了完整且成功导入的模块信息。
1.8 循环导入
循环导入(circular import)是一种死循环,即A代码需要B才能执行,而偏偏B代码是建立在A代码基础上。
二、包
包(Package)可以看成模块的集合,只要一个文件夹下面有__init__.py文件,那么该文件夹就可以看作一个包。包下面还可以有子包。
导入包的过程与导入模块的基本一致,只是导入包的时候会执行目录下的__init__.py,而不是模块里的语句。另外,如果只是单纯地导入包,而包的__init__.py中又没有明确的其他初始化操作,那么此包下面的模块是不会自动导入的。
例如,一个简章的包目录
Pac/
__init__.py
Subpac1/
__init__.py
Modu1.py
Subpac2/
__init__.py
Modu1.py
导入方法:
from Pac.Subpac1 import Modu1
import Pac.Subpac1.Modu1
三、程序打包
Python提供了Distutils、Setuptools、Py2exe、PyInstaller、cx_freeze等程序打包工具,其中,Setuptools是Distutils的增强工具,Py2exe、PyInstaller、cx_freeze是windows平台下制作exe文件的工具。Distutils包含在Python的标准版发行包中。
3.1 Distutils
例如,首先建立一个hello.py文件。
(1)建立一个setup.py文件,内容如下:
from distutils.core import setup
setup(name='hello',version='1.0',description='hello ccc',author='cheng',py_modules=['hello'])
(2)执行打包命令:
>>>python setup.py sdist
结果:该命令创建了dist目录,并将要打包的文件复制到hello-1.0.zip的压缩文件中。
3.2 py2ext
py2exe暂时到目前只支持到3.4版本(包括cxfreeze),在3.5版本中会报错。
(1)建立建立一个setup.py文件,内容如下:
from distutils.core import setup
import py2exe
setup(console=['hello.py'])
(2)执行命令:
>>>python setup.py py2exe