5. 创建已构建的分发

注解

本文件仅保留至 setuptools https://setuptools.readthedocs.io/en/latest/setuptools.html上的文档独立地涵盖了此处当前包含的所有相关信息。

“build distribution”是您可能习惯将其视为“二进制软件包”或“安装程序”(取决于您的背景)。不过,它不一定是二进制的,因为它可能只包含Python源代码和/或字节代码;我们不称它为包,因为这个词已经在Python中使用了。(而“安装程序”是一个特定于主流桌面系统的术语。)

构建的发行版是让模块发行版的安装人员尽可能轻松地生活的方式:对于基于RPM的Linux系统的用户,它是一个二进制RPM;对于Windows用户,它是一个可执行的安装程序;对于基于Debian的Linux用户,它是一个Debian包;等等。显然,没有人能够在阳光下为每个平台创建构建的发行版,因此distuils的设计目的是使模块开发人员能够专注于他们的专业——编写代码和创建源代码发行版——而中间物种称为 封装工人 为了尽可能多的平台将源代码分发转换为内置分发。

当然,模块开发人员可以是他们自己的打包者;或者打包者可以是一个志愿者,在某个地方可以访问原始开发人员无法访问的平台;或者可以是软件定期获取新的源发行版,并将其转换为软件可以访问的任意多个平台的内置发行版。去。无论它们是谁,打包程序都使用安装脚本和 bdist 命令族以生成生成生成的分发。

作为一个简单的例子,如果我在distutils源代码树中运行以下命令:

python setup.py bdist

然后distuils构建我的模块分发版(在本例中是distuils本身),执行“假”安装(也在 build 目录),并为我的平台创建默认类型的内置分发。内置发行版的默认格式是Unix上的“哑”tar文件,Windows上的简单可执行安装程序。(该tar文件被认为是“哑的”,因为它必须在特定位置解包才能工作。)

因此,上述命令在UNIX系统上创建 Distutils-1.0.{plat}.tar.gz ;从正确的位置解包这个tarball安装distutils,就像您下载了源分发版并运行 python setup.py install . (正确的位置是文件系统或python的根目录 {prefix} 目录,具体取决于 bdist_dumb 命令;默认设置是相对于 {prefix} )

显然,对于纯Python发行版来说,这并不比运行 python setup.py install ---但是对于非纯发行版,其中包括需要编译的扩展,这可能意味着有人能够使用或不使用您的扩展。而且,创建“智能”构建的发行版,例如RPM包或Windows的可执行安装程序,对用户来说更方便,即使您的发行版不包含任何扩展。

这个 bdist 命令有一个 --formats 选项,类似于 sdist 命令,可用于选择要生成的生成分发的类型:例如,::

python setup.py bdist --format=zip

在UNIX系统上运行时,会创建 Distutils-1.0.{plat}.zip ---同样,这个归档文件将从根目录解包以安装distuils。

可用于构建分发的格式有:

格式

描述

笔记

gztar

gzipped tar文件 (.tar.gz )

(1)

bztar

bzipped tar文件 (.tar.bz2 )

xztar

xzipped tar文件 (.tar.xz )

ztar

压缩tar文件 (.tar.Z )

(3)

tar

焦油锉 (.tar )

zip

压缩文件 (.zip )

(2),(4)

rpm

RPM

(5)

pkgtool

索拉里斯 pkgtool

sdux

HPUX swinstall

msi

Microsoft安装程序。

在 3.5 版更改: 增加了对 xztar 格式。

笔记:

  1. UNIX上的缺省

  2. Windows上的默认设置

  3. 需要外部 compress 实用工具。

  4. 需要外部 zip 效用或 zipfile 模块(自python 1.6以来标准python库的一部分)

  5. 需要外部 rpm 实用程序,3.0.4版或更高版本(使用 rpm --version 找出你的版本)

你不必使用 bdist 命令 --formats 选项;您还可以使用直接实现您感兴趣的格式的命令。其中一些 bdist “子命令”实际上生成了几种类似的格式;例如, bdist_dumb 命令生成所有“哑”存档格式 (tar , gztar , bztar , xztar , ztar 和 zip ) bdist_rpm 生成二进制和源RPM。这个 bdist 子命令及其生成的格式为:

命令

格式

bdist_dumb

tar、gztar、bztar、xztar、ztar、zip

bdist_rpm

每分钟转数

bdist_msi

大规模集成电路

注解

自Python 3.9以来,bdist_msi已被弃用。

以下各节详细介绍了 bdist_* 命令。

5.1. 创建RPM包

RPM格式被许多流行的Linux发行版使用,包括RedHat、SuSE和Mandrake。如果其中一个(或任何其他基于RPM的Linux发行版)是您的常规环境,那么为同一发行版的其他用户创建RPM包就很简单了。根据模块分布的复杂性和Linux发行版之间的差异,您还可以创建在不同的基于RPM的发行版上工作的RPM。

创建模块分发的RPM的通常方法是运行 bdist_rpm 命令:

python setup.py bdist_rpm

或 bdist 命令 --format 选项:

python setup.py bdist --formats=rpm

前者允许您指定特定于RPM的选项;后者允许您在一次运行中轻松地指定多种格式。如果需要同时执行这两项操作,则可以显式指定多个 bdist_* 命令及其选项:

python setup.py bdist_rpm --packager="John Doe <jdoe@example.org>"

创建RPM包由 .spec 文件,就像使用distutils一样,是由安装脚本驱动的。为了让你的生活更轻松, bdist_rpm 命令通常创建一个 .spec 文件基于您在安装脚本、命令行和任何distuils配置文件中提供的信息。中的各种选项和节 .spec 文件从安装脚本中的选项派生,如下所示:

RPM .spec 文件选项或节

distutils安装脚本选项

名字

name

总结(前言)

description

版本

version

小贩

author and author_email, or --- & maintainer and maintainer_email

版权

license

网址

url

%说明(章节)

long_description

此外,在 .spec 安装脚本中没有相应选项的文件。其中大部分都是通过 bdist_rpm 命令如下:

RPM .spec 文件选项或节

bdist_rpm 选项

默认值

释放

release

“1”

组

group

“开发/类库”

小贩

vendor

(见上文)

封装机

packager

(无)

提供

provides

(无)

要求

requires

(无)

冲突

conflicts

(无)

废弃的

obsoletes

(无)

分布

distribution_name

(无)

BuildRequires

build_requires

(无)

偶像

icon

(无)

显然,即使在命令行上提供其中的一些选项也会很繁琐且容易出错,因此通常最好将它们放在安装配置文件中, setup.cfg ---见第节。 正在写入安装程序配置文件 . 如果您分发或打包许多python模块分发版,您可能希望将应用于所有这些分发版的选项放在您的个人distuils配置文件中。 (~/.pydistutils.cfg )如果要临时禁用此文件,可以通过 --no-user-cfg 选择权 setup.py .

构建二进制RPM包有三个步骤,所有步骤都由distutils自动处理:

  1. 创建一个 .spec 文件,它描述了包(类似于distuils安装脚本;实际上,安装脚本中的大部分信息都会在 .spec 文件)

  2. 创建源RPM

  3. 创建“二进制”RPM(可能包含也可能不包含二进制代码,这取决于模块分发版是否包含Python扩展)

通常,RPM将最后两个步骤捆绑在一起;使用distutils时,通常将这三个步骤捆绑在一起。

如果你愿意,你可以把这三个步骤分开。你可以使用 --spec-only 选择权 bdist_rpm 只需创建 .spec 归档并退出;在这种情况下, .spec 文件将写入“分发目录”--通常 dist/ ,但可通过 --dist-dir 选择权。(通常, .spec 文件会深入到“构建树”中,位于由创建的临时目录中 bdist_rpm )

5.2. 在Windows上交叉编译

从python 2.6开始,distutils能够在Windows平台之间进行交叉编译。实际上,这意味着在安装了正确的工具后,可以使用32位版本的Windows来创建64位扩展,反之亦然。

要为备用平台生成,请指定 --plat-name 生成命令的选项。有效值当前为“win32”和“win-amd64”。例如,在32位版本的Windows上,可以执行:

python setup.py build --plat-name=win-amd64

要构建您的扩展的64位版本,请执行以下操作。

将在32位版本的Windows上创建64位安装可执行文件。

要进行交叉编译,必须下载python源代码,并为目标平台对python本身进行交叉编译-不可能从python的二进制安装(因为不包括其他平台的.lib等文件)中进行。实际上,这意味着32位操作系统的用户需要使用Visual Studio 2008来操作。恩 PCbuild/PCbuild.sln 解决方案在python源代码树中,并在交叉编译扩展之前构建“pythoncore”项目的“x64”配置。

请注意,默认情况下,Visual Studio 2008不安装64位编译器或工具。您可能需要重新执行Visual Studio安装过程并选择这些工具(使用“控制面板”-> [Add/Remove] 程序是检查或修改现有安装的方便方法。)

5.2.1. 安装后脚本

从python 2.3开始,可以使用 --install-script 选择权。必须指定脚本的基名称,并且脚本文件名也必须列在安装函数的脚本参数中。

复制完所有文件后,将在安装时在目标系统上运行此脚本, argv[1] 设置为 -install ,然后在卸载时用 argv[1] 设置为 -remove .

安装脚本嵌入在Windows Installer中运行,每个输出 (sys.stdout , sys.stderr )被重定向到缓冲区,脚本完成后将显示在GUI中。

在此上下文中特别有用的一些函数在安装脚本中作为附加的内置函数提供。

directory_created(path)
file_created(path)

当安装时PostInstall脚本创建目录或文件时,应该调用这些函数。它会注册的 path 使用卸载程序,以便在卸载分发时将其删除。为了安全起见,只有当目录为空时才删除它们。

get_special_folder_path(csidl_string)

此功能可用于检索Windows上的特殊文件夹位置,如“开始”菜单或桌面。它返回文件夹的完整路径。 csidl_string 必须是以下字符串之一:

"CSIDL_APPDATA"

"CSIDL_COMMON_STARTMENU"
"CSIDL_STARTMENU"

"CSIDL_COMMON_DESKTOPDIRECTORY"
"CSIDL_DESKTOPDIRECTORY"

"CSIDL_COMMON_STARTUP"
"CSIDL_STARTUP"

"CSIDL_COMMON_PROGRAMS"
"CSIDL_PROGRAMS"

"CSIDL_FONTS"

如果无法检索文件夹, OSError 提高了。

哪些文件夹可用取决于确切的Windows版本,也可能取决于配置。有关详细信息,请参阅Microsoft的文档 SHGetSpecialFolderPath() 功能。

create_shortcut(target, description, filename[, arguments[, workdir[, iconpath[, iconindex]]]])

此函数创建快捷方式。 目标 是通过快捷方式启动程序的路径。 description 是快捷方式的说明。 filename 是用户将看到的快捷方式的标题。 参数 指定命令行参数(如果有)。 工作迪尔 是程序的工作目录。 图标路径 是包含快捷方式图标的文件,以及 图标索引 是文件中图标的索引 图标路径 . 同样,有关详细信息,请参阅Microsoft文档 IShellLink 接口。