pip的加速器,Python包管理器
项目描述
pip-accel程序是Python包管理器pip的包装器。它通过结合以下两种方法加速pip的使用来初始化Python虚拟环境,给定一个或多个需求文件。
将源分发下载缓存并用于生成本地源分发归档索引。如果所有依赖项都锁定到绝对版本,并且之前已缓存了源分发下载,则pip-accel根本不需要网络连接!这是pip可能如此慢的一个原因:给定在下载缓存中可用的绝对锁定依赖项,它仍然会扫描PyPI和分发网站。
使用二进制分发来加速安装具有二进制组件(如M2Crypto和LXML)的依赖项的过程。我们不是为每个虚拟环境重新编译这些依赖项,而是只编译一次并将结果作为二进制*.tar.gz分发缓存起来。
此外,从0.9版本开始,pip-accel包含了一个简单的机制,当构建失败时,它会检测缺失的系统包,并提示用户是否安装缺失的依赖并重试构建。
pip-accel程序目前在cPython 2.6、2.7、3.4和3.5以及PyPy(2.7)上进行测试。自动测试套件定期在Ubuntu Linux(Travis CI)以及Microsoft Windows(AppVeyor)上运行。除了这些平台,pip-accel还应该能够在大多数UNIX系统(例如Mac OS X)上运行良好。
状态
Paylogic使用pip-accel快速可靠地初始化其持续集成从属服务器上的虚拟环境,这些服务器不断运行单元测试(这是pip-accel最初开发的一个用例之一)。我们也在我们的构建服务器上使用它。
当pip-accel最初开发时,PyPI有时非常不可靠(当时PyPI没有CDN)。由于CDN,PyPI现在更加可靠,但pip-accel仍然有其用武之地。
CDN对于分布站点没有帮助,因为它们和以前一样不可靠。
通过使用pip-accel,您可以使Python部署完全独立于互联网连接。
由于pip-accel缓存了编译后的二进制包,它仍然可以在使用纯pip时提供速度提升。
用法
pip-accel命令支持pip支持的所有子命令和选项,但它当然仅适用于pip install子命令。例如
$ pip-accel install -r requirements.txt
或者您也可以这样运行pip-accel,但请注意这需要Python 2.7或更高版本(它不适用于Python 2.6)
$ python -m pip_accel install -r requirements.txt
如果您传递了-v或--verbose选项,那么pip和pip-accel都将使用详细输出。也支持-q或--quiet选项。
根据运行pip-accel的用户,默认使用以下文件位置
root用户 |
所有其他用户 |
用途 |
---|---|---|
/var/cache/pip-accel |
~/.pip-accel |
用于存储源/二进制索引 |
此默认值可以通过定义环境变量PIP_ACCEL_CACHE来覆盖。
配置
对于大多数用户,pip-accel的默认配置应该很好。如果您确实想更改pip-accel的默认值,您可以通过设置环境变量和/或向配置文件添加配置选项来实现。这是因为pip-accel与pip共享命令行界面,并添加针对pip-accel特定的命令行选项是非平凡的,并可能最终导致比它值得的更多混淆 :-). 有关可用配置选项和相应的环境变量的概述,请参阅pip_accel.config模块的文档。
它有多快?
为了给您一个关于pip-accel有效性的概念,以下是Paylogic内部一个代码库构建虚拟环境的测试结果。此代码库需要超过40个依赖项,包括需要使用SWIG和C编译器编译的几个包
程序 |
描述 |
持续时间 |
百分比 |
---|---|---|---|
pip |
默认配置 |
444秒 |
100%(基线) |
pip |
具有下载缓存(首次运行) |
416秒 |
94% |
pip |
带有下载缓存(第二次运行) |
318秒 |
72% |
pip-accel |
第一次运行 |
397秒 |
89% |
pip-accel |
第二次运行 |
30秒 |
7% |
备选缓存后端
与pip-accel捆绑的是本地缓存后端(在本地文件系统上存储分发存档)和一个Amazon S3后端(见下文)。
这两个缓存后端都使用通用的插件式缓存后端注册机制在pip-accel中注册。这种机制使得在不修改pip-accel的情况下注册额外的缓存后端成为可能。如果您对此感兴趣,请参阅pip-accel的setup.py脚本和定义捆绑后端的两简单Python模块。
如果您编写了一个可能对他人有价值的缓存后端,请随时在GitHub上打开一个问题或拉取请求,以便将您的后端捆绑到pip-accel中。
在Amazon S3上存储二进制缓存
您可以配置pip-accel将二进制缓存文件存储在Amazon S3桶中。在这种情况下,Amazon S3被视为第二级缓存,仅在本地文件系统缓存无法满足依赖项时使用。如果依赖项未在Amazon S3桶中找到,则构建和缓存包(如通常那样)并将其保存到Amazon S3桶。此功能对于持续集成构建工作机非常有用,这些工作机是临时的,并且没有持久的本地存储来存储pip-accel二进制缓存。
要开始,您需要按照以下方式安装pip-accel
$ pip install 'pip-accel[s3]'
[s3]部分通过安装Boto包启用Amazon S3缓存后端。一旦安装,您可以使用以下环境变量来配置Amazon S3缓存后端
- $PIP_ACCEL_S3_BUCKET
应缓存二进制分发存档的Amazon S3桶的名称。此环境变量是启用Amazon S3缓存后端所必需的。
- $PIP_ACCEL_S3_PREFIX
应用于所有Amazon S3键的可选前缀。这允许基于pip-accel运行的环境进行命名空间(以隔离不兼容的系统的二进制缓存)。用户目前负责选择合适的前缀。
- $PIP_ACCEL_S3_READONLY
如果设置了此选项,pip-accel将跳过上传到Amazon S3桶。这意味着pip-accel将使用配置的Amazon S3桶来“预热”您的本地缓存,但它永远不会写入桶,因此您可以使用只读凭据。当然,您需要至少运行一个具有写权限的pip-accel实例,因此此设置最适合在例如持续集成(CI)服务器周围工作的团队,CI服务器预热缓存,而开发者以只读模式使用缓存。
您也可以从配置文件设置这些选项,请参阅pip_accel.config模块的文档。您还需要设置AWS凭证,在.boto文件中或通过$AWS_ACCESS_KEY_ID和$AWS_SECRET_ACCESS_KEY环境变量(有关详细信息,请参阅Boto文档)。
使用与S3兼容的存储服务
如果您想将pip-accel指向一个与S3兼容的存储服务(但不限于Amazon S3),您可以使用配置选项或环境变量来覆盖S3 API URL。例如,pip-accel测试套件首先安装并启动FakeS3,然后设置PIP_ACCEL_S3_URL=http://localhost:12345将pip-accel指向FakeS3服务器(为了测试Amazon S3缓存后端,实际上不必支付Amazon S3桶的费用:-)。有关更多详细信息,请参阅Amazon S3缓存后端的文档。
设置要求缓存
自0.38版本以来,pip-accel指示setuptools将设置需求缓存到pip-accel数据目录的子目录中(参见eggs_cache选项),以避免重新编译设置需求。这是通过在pip或pip-accel运行设置脚本之前,向未打包的源分布目录中注入一个名为.eggs的符号链接来实现的。
使用.eggs目录是在setuptools 7.0版本中添加的,这就是为什么pip-accel现在需要安装7.0或更高版本的setuptools。添加这个依赖项的原因是pip-accel的整个目的就是即插即用,保护用户免受意外行为的影响,如设置需求减慢速度和破坏离线安装。
系统包依赖
自0.9版本以来,pip-accel包含一个简单的机制,当构建失败时,它会检测缺失的系统包,并提示用户是否安装缺失的依赖项并重试构建。目前只支持Debian Linux及其衍生版本,尽管很容易添加对其他平台的支持。此功能目前基于配置文件,该文件定义了Python包对系统包的依赖关系。这意味着结果应该相当可靠,但每个依赖项都需要手动定义...
以下是在实际中的应用示例
2013-06-16 01:01:53 wheezy-vm INFO Building binary distribution of python-mcrypt (1.1) .. 2013-06-16 01:01:53 wheezy-vm ERROR Failed to build binary distribution of python-mcrypt! (version: 1.1) 2013-06-16 01:01:53 wheezy-vm INFO Build output (will probably provide a hint as to what went wrong): gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DVERSION="1.1" -I/usr/include/python2.7 -c mcrypt.c -o build/temp.linux-i686-2.7/mcrypt.o mcrypt.c:23:20: fatal error: mcrypt.h: No such file or directory error: command 'gcc' failed with exit status 1 2013-06-16 01:01:53 wheezy-vm INFO python-mcrypt: Checking for missing dependencies .. 2013-06-16 01:01:53 wheezy-vm INFO You seem to be missing 1 dependency: libmcrypt-dev 2013-06-16 01:01:53 wheezy-vm INFO I can install it for you with this command: sudo apt-get install --yes libmcrypt-dev Do you want me to install this dependency? [y/N] y 2013-06-16 01:02:05 wheezy-vm INFO Got permission to install missing dependency. The following extra packages will be installed: libmcrypt4 Suggested packages: mcrypt The following NEW packages will be installed: libmcrypt-dev libmcrypt4 0 upgraded, 2 newly installed, 0 to remove and 68 not upgraded. Unpacking libmcrypt4 (from .../libmcrypt4_2.5.8-3.1_i386.deb) ... Unpacking libmcrypt-dev (from .../libmcrypt-dev_2.5.8-3.1_i386.deb) ... Setting up libmcrypt4 (2.5.8-3.1) ... Setting up libmcrypt-dev (2.5.8-3.1) ... 2013-06-16 01:02:13 wheezy-vm INFO Successfully installed 1 missing dependency. 2013-06-16 01:02:13 wheezy-vm INFO Building binary distribution of python-mcrypt (1.1) .. 2013-06-16 01:02:14 wheezy-vm INFO Copying binary distribution python-mcrypt-1.1.linux-i686.tar.gz to cache as python-mcrypt:1.1:py2.7.tar.gz.
与tox集成
您可以使用一个小型shell脚本告诉Tox使用pip-accel,该脚本首先使用pip安装pip-accel,然后使用pip-accel引导虚拟环境。您可以在GitHub上的问题#30中找到有关此内容的详细信息。
pip-accel的控制流程
pip-accel的工作方式不太直观,但非常有效。以下是控制流程概述。一旦查看代码,您会发现以下步骤都嵌入在一个循环中,多次重试。这主要是因为第二步(下载源分布)。
运行pip install --download=... --no-index -r requirements.txt来解包本地源索引中可用的源分布。这是第一步,因为pip-accel应该接受requirements.txt文件作为输入,但它将手动从缓存的二进制分布中安装依赖项(而不使用pip或easy_install)
如果命令成功执行,这意味着所有依赖项都已作为已下载的源分布可用。我们将解析步骤1的详细pip输出,以找到在requirements.txt中定义的直接和间接依赖项(名称和版本),并将它们用作步骤3的输入。转到步骤3。
如果命令失败,可能意味着尚未作为本地源分布提供所有依赖项,因此我们应该下载它们。转到步骤2。
运行pip install --download=... -r requirements.txt将下载的源分布下载到下载缓存
如果命令失败,这意味着pip在扫描PyPI、扫描分布网站、下载源分布或解包源分布时遇到错误。通常这些错误是间歇性的,所以重试几次是值得一试的。转到步骤2。
如果命令成功执行,这意味着所有依赖项现在都作为本地源分布可用;我们不再需要网络了!转到步骤1。
对于尚无缓存的二进制分布的每个依赖项,运行python setup.py bdist_dumb --format=gztar(考虑版本号)。转到步骤4。
根据步骤1中获得的直接和间接依赖项列表,从二进制分布中安装所有依赖项。我们必须手动执行这些安装,因为easy_install和pip都不支持二进制*.tar.gz分布。
联系方式
如果您有任何问题、错误报告、建议等,请在 GitHub 项目页面 上创建问题。pip-accel 的最新版本始终可在 GitHub 上找到。内部 API 文档托管在 Read The Docs 上。
许可证
本软件遵循与 MIT 许可证 相同的许可协议,与 pip(pip-accel 的基础)一样。
© 2016 Peter Odding 和 Paylogic 国际公司。
项目详情
pip-accel-0.43.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1e61f999b5a8d48dcf40b42ee0b5581d644ab098275f4d4c749f0fa79e40b03c |
|
MD5 | 8f29f0273063cce06a1735b89b00d52f |
|
BLAKE2b-256 | c9a189615ba2ceb858595e001610fb0239a19fd302d5848ab86f34eb6ab2972b |