1. Distutils 简介

本文档介绍如何使用 Distutils 分发 Python 模块,并着重于开发人员/分发者的角色:如果要查找有关安装 Python 模块的信息,请参考安装 Python 模块(旧版)章。

1.1. 概念与术语

对于模块开发人员和安装第三方模块的用户/Management 员而言,使用 Distutils 都非常简单。作为开发人员,您的责任(当然,除了编写可靠,记录良好和经过测试的代码!):

  • 编写安装脚本(按惯例setup.py)

  • (可选)写入设置配置文件

  • 创建源分发

  • (可选)创建一个或多个内置(二进制)发行版

本文档介绍了这些任务中的每一个。

并非所有的模块开发人员都可以使用多种平台,因此,期望他们创建多种内置发行版并不总是可行的。希望会出现一类称为包装商的中介机构来解决这一需求。打包人员将获取由模块开发人员发布的源发行版,在一个或多个平台上构建它们,然后发布生成的内置发行版。因此,最流行平台上的用户将能够以最自然的方式为其平台安装最流行的 Python 模块发行版,而不必运行单个安装脚本或编译一行代码。

1.2. 一个简单的例子

安装脚本通常非常简单,尽管由于它是用 Python 编写的,所以对它的操作没有任何限制,尽管您应谨慎地在安装脚本中放置任意昂贵的操作。与 Autoconf 风格的配置脚本不同,在构建和安装模块发行版的过程中,安装脚本可能会多次运行。

如果您要做的就是分发名为foo的模块,该模块包含在文件foo.py中,那么您的安装脚本可以像这样简单:

from distutils.core import setup
setup(name='foo',
      version='1.0',
      py_modules=['foo'],
      )

Some observations:

  • 您提供给 Distutils 的大多数信息都作为setup()函数的关键字参数提供

  • 这些关键字参数分为两类:包元数据(名称,版本号)和有关包中内容的信息(在这种情况下为纯 Python 模块列表)

  • 模块是由模块名称而不是文件名指定的(软件包和 extensions 也是如此)

  • 建议您提供更多的元数据,尤其是您的姓名,电子邮件地址和项目的 URL(有关示例,请参见编写安装脚本部分)

要为此模块创建源分发,您将创建一个包含以上代码的安装脚本setup.py,并从终端运行以下命令:

python setup.py sdist

对于 Windows,打开命令提示符窗口(开始‣附件)并将命令更改为:

setup.py sdist

sdist 将创建一个包含安装脚本setup.py和模块foo.py的存档文件(例如,Unix 上的 tarball,Windows 上的 ZIP 文件)。存档文件将被命名为foo-1.0.tar.gz(或.zip),并将解压缩到目录foo-1.0中。

如果finally用户希望安装foo模块,那么他们要做的就是下载foo-1.0.tar.gz(或.zip),解压缩并从foo-1.0目录运行

python setup.py install

finally会将foo.py复制到第三方模块在其 Python 安装中的适当目录中。

这个简单的示例演示了 Distutils 的一些基本概念。首先,开发人员和安装人员都具有相同的基本用户界面,即安装脚本。区别在于它们使用的是 Distutils 命令:sdist 命令几乎专门用于模块开发人员,而 install **对于安装人员来说更常见(尽管大多数开发人员会偶尔安装自己的代码)。

如果您想让用户 true 轻松,可以为他们创建一个或多个内置发行版。例如,如果您在 Windows 计算机上运行,并且想让其他 Windows 用户更轻松,则可以使用 bdist_wininst 命令创建可执行安装程序(该平台最适合的内置发行版类型)。例如:

python setup.py bdist_wininst

将在当前目录中创建一个可执行安装程序foo-1.0.win32.exe

其他有用的内置分发格式是 RPM,由 bdist_rpm 命令,Solaris pkgtool ( bdist_pkgtool )和 HP-UX swinstall ( bdist_sdux )实现。例如,以下命令将创建一个名为foo-1.0.noarch.rpm的 RPM 文件:

python setup.py bdist_rpm

( bdist_rpm 命令使用 rpm 可执行文件,因此必须在基于 RPM 的系统(例如 Red Hat Linux,SuSE Linux 或 Mandrake Linux)上运行。)

您可以pass运行来随时查找可用的分发格式

python setup.py bdist --help-formats

1.3. 通用 Python 术语

如果您正在阅读本文档,则可能对什么模块,扩展等有所了解。不过,为了确保每个人都从一个共同的起点开始工作,我们提供以下 Python 通用术语表:

  • module

    • Python 中代码可重用性的基本单位:由其他一些代码导入的代码块。这里涉及到三种类型的模块:纯 Python 模块,扩展模块和包。
  • 纯 Python 模块

    • 用 Python 编写并包含在单个.py文件(以及可能关联的.pyc和/或.pyo文件)中的模块。有时称为“纯模块”。
  • extension module

    • 用 Python 实现的底层语言编写的模块:Python 的 C/C,Jython 的 Java。通常包含在单个可动态加载的预编译文件中,例如 Unix 上用于 Python 扩展的共享对象(.so)文件,Windows 上用于 Python 扩展的 DLL(给.pydextensions)或 Jython 扩展的 Java 类文件。 (请注意,当前,Distutils 仅处理 Python 的 C/C 扩展.)
  • package

    • 包含其他模块的模块;通常包含在文件系统的目录中,并pass文件__init__.py与其他目录区分开。
  • root package

    • 包层次结构的根。 (这实际上不是软件包,因为它没有__init__.py文件.但是我们必须称呼它.)绝大多数标准库都在根软件包中,许多小型独立第三方也是如此。不属于较大模块集合的模块。与常规软件包不同,根软件包中的模块可以在许多目录中找到:实际上,sys.path中列出的每个目录都将模块添加到根软件包中。

1.4. Distutils 专用术语

以下术语更具体地适用于使用 Distutils 分发 Python 模块的领域:

  • module distribution

    • Python 模块的集合,这些模块作为单个可下载资源一起分发,并且打算大规模安装。一些众所周知的模块分布的示例是数字 Python,PyXML,Pillow 或 mxBase。 (这将称为* package *,除了该术语已在 Python 上下文中使用:单个模块分发可能包含零个,一个或多个 Python 软件包.)
  • 纯模块分配

    • 一个仅包含纯 Python 模块和软件包的模块发行版。有时称为“纯分布”。
  • 非纯模块分配

    • 包含至少一个扩展模块的模块分发。有时也称为“非纯分布”。
  • distribution root

    • 您的源代码树(或源代码分发)的顶级目录; setup.py所在的目录。通常,setup.py将在此目录中运行。