包的概念
Python的程序由包、模块和函数组成。包是由一系列模块组成的集合,模块是处理某一类问题的函数和类的集合,它们之间的关系如图所示。
Python提供了许多有用的工具包,如字符串处理、Web应用、图像处理等,这些自带的工具包和模块安装在Python的安装目录下的Lib子目录中。包是一个至少包含__int__.py文件的文件夹,init.py文件一般用来进行包的某些初始化工作或者设置__all__值,其内容可以为空。
假设首先在包pack中创建两个子包:pack1和pack2,然后在包pack1中定义模块myModule1,在包pack2中定义模块myModule2,最后在包pack中定义一个模块main,调用子包pack1和pack2中的模块,具体结构如下所示:
其中,pack1包下的__init__.py文件内容如下:
pack1包下的myModule1.py文件内容如下:
pack2包下的__init__.py文件内容如下:
pack2包下的myModule2.py文件内容如下:
pack包下的__init__.py文件内容如下:
pack包下的main.py文件内容如下:
运行main.py程序,则运行结果如图所示。
从程序运行结果可发现,导入模块过程中遇到的所有__init__.py文件都会被执行。从包中导入单独的模块可以使用以下种3方法:
当需要导入某个包下的所有模块时,不可以直接使用如下语句:
这时需要使用__all__记录当前包所包含的模块,例如在pack1包的__init__.py文件中第一行添加如下代码:
其中方括号中的内容是模块名的列表,如果模块数量超过两个,使用逗号分开。同理,在pack2包的__init__.py文件中也添加一行类似的代码:
这样就可以在main.py模块中一次导入pack1、pack2包中所有的模块,pack包下的main.py文件内容如下:
运行main.py程序,运行结果如图所示。
如果pack1包下的myModule1.py文件需要引用pack2包下的myModule2模块,默认情况下,myModule1.py文件是找不到myModule2模块,此时需要按相对位置引入模块,修改myModule1.py文件,具体如下所示:
其中,“…”表示包含from导入命令的模块文件所在路径的上一级目录,运行main.py程序,则运行结果如图所示。
包的发布
本节将演示如何将写好的模块进行打包和发布,最简单的方法是将包直接复制到Python的lib目录,但此方式不便于管理与维护,存在多个Python版本时会非常混乱。接下来通过编写setup.py来对9.5节介绍的pack模块进行打包。
(1)在pack所在的文件目录下新建setup.py、MANIFEST.in、README.txt文件,其目录结构如下:
(2)打开setup.py文件,编辑其内容如下:
其中,packages指明将要发布的包。
打开MANIFEST.in文件,编辑其内容如下:
该文件列出各种希望包含在包中的非源代码。
README.txt文件中的内容为提示使用者如何使用该包中的模块。
(3)在终端模式下,进入pack包所在的文件目录执行如下命令:
该命令可以构建包,具体执行过程如图所示。
执行完该命令后,目录结构如下所示:
(4)接着在终端模式下输入以下命令:
该命令可以生成最终发布的压缩包,具体执行过程如图所示。
执行完该命令后,目录结构如下所示:
其中,dist目录下myProject-1.0.tar.gz文件为将要发布的包,开发者可以将此文件发布给其他人或上传到Python社区供更多的开发者下载。
包的安装
(1)进入压缩包所在的文件目录并对其进行解压,解压后的文件目录如下所示:
(2)在终端模式下,进入myProject-1.0目录下执行如下命令:
该命令具体执行过程如图所示。
通过该命令就可以将pack包安装到系统(即Python路径)中,即该包存在于D:\python3.6.2\Lib\site-packages(本书中Python的安装目录为D:\python3.6.2)。