Tips 26
脚本、库、框架或应用程序编写完成后,如果想与别人共享,这时就需要进行打包。
python3自带Distutils的打包框架,它包含了许多功能:构建工具(开发者使用),安装工具(用户使用),数据包格式(为搜索引擎准备)等,它集成了python安装包索引 ("PyPI"),一个开源python类库的中央资料库。这些Distutils的不同功能以setup 脚本为中心,一般被命名为setup.py。
Distutils试图尽可能的自动完成全部打包工作,但仍然有些部分需要人为操作。
- 选择一种许可协议,如GPL
- 使用PyPI分来系统对软件进行分类
- 撰写readme文件,用户一般从这里了解你的软件
目录结构
要进行python软件的打包,必须先将文件和目录安排好。例如httplib2的目录树如下:
httplib2/ # 创建根目录来保存所有的目录和文件,以python模块的名字命名
+--README.txt # 为了适应window用户,readme文件包含.txt扩展名
+--setup.py # Distutils安装脚本命名为setup.py
+--httplib2/ # 如果你的python软件只包含一个单一的.py文件,可以放在根目录,此处httplib2包含多个文件,这样可以在根目录下放置httplib2目录,在httplib2目录下,包含一个__init__.py的文件的httplib2目录。
+--__init__.py
+--iri2uri.py
安装脚本编写
Distutils安装脚本是一份python脚本。 每个Distutils安装脚本的第一行总是:
from distutils.core import setup
该行导入setup()函数,是Distutils的主入口点。setup()方法可以有几十个参数。为了使每个参与者都能清除,必须对每个参数使用命名参数。如果尝试以非命名变量调用setup()方法,安装脚本会崩溃。 下面的命名变量是必需的:
- name, 安装包名称
- version, 安装包的版本
- author, 您的全名
- author_email, 您的邮件地址
-
url, 项目主页 以下内容,不是必须的,但建议尽量包含:
-
description, 在线的项目摘要
- long_description 以rsStructuredTextformat格式编写的多行字符串。
- classfilers, 特别格式化字符串
包分类
Python包索引("PyPI")包含成千上万的Python库。正确的分类数据将让人脉更容易找到你的包。PyPI让你以类别的形式浏览包。可以通过传递classifiers参数给Distutils的setup()方法来给你的软件分类。classifers参数是一个字符串列表。这些字符串不是任意格式,都应该来自PyPI上的列表。虽然分类是可选的,但最好至少包括以下分类:
- 编程语言。应该包括"Programming Language :: Python"和"Programming Language :: Python :: 3"。如果你不包括这些,你的包将不会出现在兼容Python3的库列表中。
- 许可证。当评价一个第三方库时,这是要需找的第一个东西
- 操作系统。要描述软件适用的操作系统平台
还建议包括以下分类:
- 开发状态。软件产品适合beta发布么,还是alpha,还是Pre-alpha
- 目标用户。最常见的选项:Developers、End Users/Destop、Science/Research和Systm Administrators
- 框架。如果你的软件是Django或Zope这样大型框架的插件,需要包含适当的框架分类
- 主题。选择相关的主题
下面是Django分类的例子。
Programming Language :: Python
License :: OSI Approved :: BSD License
Operating System :: OS Independent
Development Status :: 5 - Production/Stable
Environment :: Web Environment
Framework :: Django
Intended Audience :: Developers
Topic :: Internet :: WWW/HTTP
Topic :: Internet :: WWW/HTTP :: Dynamic Content
Topic :: Internet :: WWW/HTTP :: WSGI
Topic :: Software Development :: Libraries :: Python
Modules
通过清单指定附加文件
默认情况下,Distutils将把下列文件包含在你的发布包中:
- README.txt
- setup.py
- 列在packages参数中的多模块文件所需的.py文件
- 在py_modules参数中列出的单独.py文件
如果还希望包含COPYING.txt许可文件或含有图像与HTML文件的如docs目录,也就是让Distutils在构建发行包时包含一些额外的文件和目录,需要创建一个manifestfile. 清单文件是一个名为MANIFEST.in的文本文件。将它放置在项目的根目录下,同README.txt和setup.py一起。清单文件不是python脚本,是文本文件,其中包含一系列Distutils定义格式的命令。清单命令允许你包含或排除特定的文件和目录。 例如chardet项目的全部清单文件:
include COPYING.txt # 包含COPYING.txt文件
recursive-include docs *.html *.css *.png *.gif # recursive-include命令需要一个目录名和至少一个文件名。这里使用了通配符。
所有的清单命令都将保持项目目录中所有的目录结构。
清单文件有自己独特的格式。
检查安装脚本的错误
Distutils带有一个内置的验证命令,它检查是否所有必须的元数据都体现在你的安装脚本中。
创建发布源
Distutils支持构建多种类型的发布包。至少,应该建立一个"源代码分发", 其中包含源代码,你的Distutils安装脚本,"readme"文件和你想要包含其他文件。
python中包含更多的打包框架:
比如偏重安装:
- Setuptools
- Pip
- Distribute
以下框架重在测试和部署:
- virtualenv
- zc.buildout
- Paver
- Fabric
- py2exe
具体的项目中,可以根据需要,选择对应的打包方式。