当新的开发人员加入团队或Jenkins运行完整的构建时,我需要创建一个新的virtualenv。我经常发现,使用Pip和大量(超过10个)需求设置virtualenv会花费很长时间才能安装PyPI中的所有内容。
通常,它会完全失败:
Downloading/unpacking Django==1.4.5 (from -r requirements.pip (line 1))
Exception:
Traceback (most recent call last):
File"/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/basecommand.py", line 107, in main
status = self.run(options, args)
File"/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/commands/install.py", line 256, in run
requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
File"/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1018, in prepare_files
self.unpack_url(url, location, self.is_download)
File"/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/req.py", line 1142, in unpack_url
retval = unpack_http_url(link, location, self.download_cache, self.download_dir)
File"/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 463, in unpack_http_url
download_hash = _download_url(resp, link, temp_location)
File"/var/lib/jenkins/jobs/hermes-web/workspace/web/.venv/lib/python2.6/site-packages/pip-1.2.1-py2.6.egg/pip/download.py", line 380, in _download_url
chunk = resp.read(4096)
File"/usr/lib64/python2.6/socket.py", line 353, in read
data = self._sock.recv(left)
File"/usr/lib64/python2.6/httplib.py", line 538, in read
s = self.fp.read(amt)
File"/usr/lib64/python2.6/socket.py", line 353, in read
data = self._sock.recv(left)
timeout: timed out
我知道Pip的--use-mirrors标志,有时我们团队中的人已经通过使用--index-url http://f.pypi.python.org/simple(或另一个镜像)进行了变通,直到他们有了一个及时响应的镜像。我们在英国,但在德国有一个PyPI镜像,从其他站点下载数据没有问题。
因此,我正在寻找内部为我们的团队反映PyPI的方法。
我看过的选项是:
运行我自己的PyPI实例。有官方的PyPI实施:CheeseShop以及几个第三方实施,例如:djangopypi和pypiserver(请参阅脚注)
这种方法的问题在于,我对文件上传的完整PyPI功能不感兴趣,我只想镜像它提供的内容。
使用pep381client或pypi-mirror运行PyPI镜像。
看起来它可以工作,但是需要我的镜像首先从PyPI下载所有内容。我已经设置了pep381client的测试实例,但是我的下载速度在5 Kb / s和200 Kb / s之间变化(位,而不是字节)。除非某个地方有完整的PyPI档案的副本,否则要花几周才能拥有一个有用的镜像。
使用PyPI轮询代理,例如yopypi。
现在,http://pypi.python.org本身由几个地理上不同的服务器组成,这是无关紧要的。
在开发人员之间围绕virtualenv复制,或托管当前项目依赖项的文件夹。
这不会扩展:我们有几个不同的Python项目,它们的依赖关系随时间变化(缓慢)。任何项目的依赖项更改后,都必须更新此中央文件夹以添加新的依赖项。但是,复制virtualenv比复制软件包更糟糕,因为任何带有C模块的Python软件包都需要针对目标系统进行编译。我们的团队同时拥有Linux和OS X用户。
(这似乎仍然是坏一堆的最佳选择。)
使用智能PyPI缓存代理:collection.eggproxy
看来这将是一个很好的解决方案,但是PyPI的最新版本是2009年,讨论了mod_python。
其他大型Python团队做什么?快速安装同一组python软件包的最佳解决方案是什么?
脚注:
我已经看到了如何滚动自己的PyPI?这个问题,但是这个问题与托管私有代码有关。
Python Wiki列出了其他PyPI实现
我最近还发现了Crate.io,但我认为使用Pip不会对我有帮助。
有一个网站监视PyPI镜像状态
PyPI上的某些软件包的文件托管在其他位置,因此即使是完美的镜像也无法帮助所有依赖项
就我个人而言,当我需要编写(重复的)virtualenv创建脚本的情况时,我只是为所需的软件包构建了.egg文件,并将它们与脚本一起放入存储库中以创建virtualenv。 但是,我不声称自己是大型python团队的一员。
您有共享的文件系统吗?
因为我会使用pip的缓存设置。很简单例如,在/ mnt中创建一个名为pip-cache的文件夹。
mkdir /mnt/pip-cache
然后,每个开发人员都将以下行放入他们的pip配置中(unix = $ HOME / .pip / pip.conf,win =%HOME% pip pip.ini)
[global]
download-cache = /mnt/pip-cache
它仍会检查PyPi,寻找最新版本。然后检查该版本是否在缓存中。如果是这样,它将从那里安装。如果没有下载。将其存储在缓存中并安装。因此,每个软件包每个新版本只能下载一次。
这看起来是一个很棒的选择。但是您的示例pip.conf不正确-不应缩进或Pip死于ConfigParser.ParsingError: File contains parsing errors。我可以自己编辑它,但绝对不能让我做些小的编辑。
固定!谢谢威尔弗雷德。
香港专业教育学院对此进行了测试,它工作完美。希望我能再投票给您,谢谢。不仅仅考虑运行服务器的最佳方法而感到荣誉。
我们决定从团队中的构建服务器复制Pip缓存的软件包:gist.github.com/Wilfred/5221953
pip还具有命令行选项--download-cache = ,因此,如果这样更容易,则无需编辑配置
虽然它不能解决您的PyPI问题,但是可以使用Terrarium完成将虚拟环境交付给开发人员(或部署)的工作。
使用terrarium打包,压缩和保存virtualenvs。您可以将它们存储在本地,甚至存储在S3上。从GitHub上的文档中:
$ pip install terrarium
$ terrarium --target testenv --storage-dir /mnt/storage install requirements.txt
建立新环境后,玻璃容器将存档并压缩该环境,然后将其复制到storage-dir指定的位置。
在随后的安装中,如果指定了相同的需求集并指定了相同的存储目录,则terrarium将从/ mnt / storage复制并提取压缩的归档文件。
要确切显示terrarium如何命名存档,可??以运行以下命令:
$ terrarium key requirements.txt more_requirements.txt
x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1
谢谢,我不了解玻璃容器。它可以处理OS X和Linux用户之间共享的情况吗?我们同时拥有纯Python和C模块,因此我怀疑编译后的程序包将是跨平台的。
我真的希望我知道。 :(我没有Mac(尽管我很想拥有一台Mac。。。)如果有机会,我会发现我能弄清楚的。我从PyCon 2013开始才开始使用此软件包(听说过并认识了开发人员那里)。
这里的玻璃容器的作者。编译的软件包不会跨平台,玻璃容器不能解决这个问题。如果您的需求不经常更改,则意味着运行该命令的每种平台类型的第一个用户将是构建器。所有后续命令执行程序(在其他要求更改之前)将拉下预构建的版本。听起来玻璃容器将是您将要尝试手动执行的易于使用的命令界面。如果您遇到任何妨碍您以这种方式使用它的问题,请告诉我。
我最近将devpi安装到开发团队的Vagrant配置中,以便其程序包缓存位于主机的文件系统上。这样,每个VM都可以拥有自己的devpi-server守护程序,并将其用作virtualenv / pip的index-url。销毁和重新配置VM后,不必反复下载软件包。每个开发人员都会下载一次以构建本地缓存,只要它们驻留在主机的文件系统上即可。
我们还为私有包提供了一个内部PyPi索引,该索引目前仅是Apache服务的目录。最终,我还将把它转换为devpi代理服务器,因此我们的构建服务器除了托管私有库外,还将为Python依赖项维护程序包缓存。这将在我们的开发环境,生产部署和公共PyPi之间创建额外的缓冲区。
到目前为止,这似乎是我找到的最可靠的解决方案。
我搜索个人/私有pypi服务器已有一段时间,必须确认,devpi似乎是其中最好的。 devpi的作者还撰写了pytest和tox,因此希望能为开发和测试找到很好的支持。
看看David Wolever的pip2pi。您只需设置一项Cron作业即可在公司或团队范围内保留所需软件包的镜像,然后将点对准内部镜像。
设置本地服务器,然后修改本地计算机的主机文件以覆盖实际URL,以指向本地服务器,从而跳过标准DNS。完成后,然后删除主机文件中的行。
或者我想您可以在pip中找到该URL并进行修改。