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

具体的项目中,可以根据需要,选择对应的打包方式。

by 李鹏