可重复安装¶
pip 可以用来实现不同级别的可重复环境。本页面逐步介绍了对“可重复”含义的越来越严格的定义。
固定软件包版本¶
在需求文件中固定依赖项的软件包版本可以保护您免受新发布版本中的错误或不兼容问题的影响。
SomePackage == 1.2.3
DependencyOfSomePackage == 4.5.6
注意
固定指的是使用 ==
运算符要求软件包为特定版本。
可以使用 pip freeze 生成包含固定软件包版本的需求文件。这将固定顶层软件包及其所有传递依赖项的版本。使用 --no-deps 执行安装将提供额外的保障,防止安装未明确列出的任何内容。
此策略易于实施,并在各种操作系统和架构上有效。但是,它信任您获取软件包的位置(例如 PyPI)和证书颁发机构链。它还依赖于这些位置不允许软件包在不增加版本的情况下进行更改。(PyPI 确实提供保护措施防止这种情况发生。)
哈希校验¶
除了固定版本号之外,您还可以添加哈希值,以校验下载的软件包。
FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
这可以防止 PyPI 或 HTTPS 证书链被入侵。它还能防止软件包在不更改版本号的情况下发生更改(在允许这种情况的索引中)。这种方法非常适合自动服务器部署。
哈希校验模式是运行包含已批准软件包的私有索引服务器的省时替代方案:它消除了上传软件包、维护 ACL 和维护审计跟踪的需要(VCS 会免费为您提供需求文件的跟踪)。它还可以替代供应商库,提供更轻松的升级和更少的 VCS 噪声。当然,它不提供私有索引或供应商库的可用性优势。
pip-tools 是一个基于 pip 的软件包,提供了一个很好的工作流程来管理和生成需求文件。
使用轮库(又称安装包)¶
pip wheel 可用于生成和打包项目的依赖项,并完成所有编译工作,并将它们打包到单个目录中,该目录可以转换为单个存档。然后,此存档可以在索引服务器不可用时进行安装,避免耗时的重新编译。
示例
在现代 Unix 系统上创建软件包
$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ python -m pip wheel -r requirements.txt --wheel-dir=$tempdir
$ cwd=`pwd`
$ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)
在现代 Unix 系统上从软件包安装
$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
$ python -m pip install --force-reinstall --no-index --no-deps $tempdir/*
请注意,此类轮库包含已编译的软件包,它们通常是特定于操作系统和架构的,因此这些存档不一定可以在不同机器之间移植。
哈希校验模式也可以与这种方法一起使用(因为它也使用需求文件),以确保将来的存档使用相同的软件包构建。
警告
注意 setup_requires
在 setup.py
中的关键字参数。使用它的(罕见的)软件包会导致 setuptools 直接下载这些依赖项,跳过 pip 的保护措施。如果您需要使用此类软件包,请参阅 控制 setup_requires。