Python PyPI很慢。如何运行自己的服务器?

Python PyPI很慢。如何运行自己的服务器?,python,caching,pip,mirroring,pypi,Python,Caching,Pip,Mirroring,Pypi,当一个新的开发人员加入团队,或者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 "

当一个新的开发人员加入团队,或者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的
——使用镜像
标志,有时我的团队成员会使用
——索引urlhttp://f.pypi.python.org/simple
(或另一个镜像),直到他们有一个及时响应的镜像。我们在英国,但德国有一个PyPI镜像,我们从其他网站下载数据没有问题

所以,我正在寻找为我们的团队在内部镜像PyPI的方法

我看到的选项有:

  • 运行我自己的PyPI实例。有官方的PyPI实现:以及一些第三方实现,如:和(见脚注)

    这种方法的问题是,我对文件上传的完整PyPI功能不感兴趣,我只想镜像它提供的内容

  • 使用或运行PyPI镜像

    这看起来是可行的,但需要我的镜像先从PyPI下载所有内容。我已经设置了pep381client的测试实例,但我的下载速度在5 Kb/s和200 Kb/s(位,而不是字节)之间变化。除非某个地方有完整的PyPI档案的副本,否则我需要几个星期才能得到一个有用的镜像

  • 使用PyPI循环代理,例如

    这一点现在已经无关紧要了,因为它本身就是由

  • 在开发人员之间复制virtualenv,或托管虚拟主机

    这是不可伸缩的:我们有几个不同的Python项目,它们的依赖关系随时间(缓慢)变化。一旦任何项目的依赖项发生更改,必须更新此中心文件夹以添加新的依赖项。但是,复制virtualenv比复制包更糟糕,因为任何带有C模块的Python包都需要为目标系统编译。我们的团队同时拥有Linux和OS X用户

    (这看起来仍然是一帮坏人的最佳选择。)

  • 使用智能PyPI缓存代理:

    这似乎是一个非常好的解决方案,但是讨论了mod_python

  • 其他大型Python团队做什么?快速安装同一套python软件包的最佳解决方案是什么

    脚注:

    • 我已经看到了这个问题,但这个问题与托管私有代码有关
    • Python维基
    • 我最近也发现了这一点,但我不认为这对我使用Pip有帮助
    • 有一个网站监控
    • 因此,即使是完美的镜子也不能帮助所有的依赖关系

    设置本地服务器,然后修改本地计算机的主机文件以覆盖实际URL,从而指向本地服务器,从而跳过标准DNS。然后删除主机文件中的行(如果已完成)


    或者我想您可以在pip中找到URL并修改它。

    您有共享文件系统吗

    因为我会使用pip的缓存设置。这很简单。例如,在/mnt中创建一个名为pip cache的文件夹

    mkdir /mnt/pip-cache
    
    然后,每个开发人员将在其pip配置中放入以下行(unix=$HOME/.pip/pip.conf,win=%HOME%\pip\pip.ini)


    它仍然检查PyPi,寻找最新版本。然后检查该版本是否在缓存中。如果是这样,它将从那里安装。如果没有,它会下载它。将其存储在缓存中并安装。因此,每个包在每个新版本中只能下载一次

    虽然不能解决PyPI问题,但可以使用将构建的VirtualNV交付给开发人员(或部署)

    用于打包、压缩和保存virtualenvs。您可以将它们存储在本地甚至本地。从GitHub上的文档中:

    $ pip install terrarium
    $ terrarium --target testenv --storage-dir /mnt/storage install requirements.txt
    
    构建新环境后,terrarium将归档和压缩环境,然后将其复制到storage dir指定的位置

    在为指定相同存储目录的相同需求集进行后续安装时,terrarium将从/mnt/storage复制并提取压缩存档

    要准确显示terrarium将如何命名存档,可以运行以下命令:

    $ terrarium key requirements.txt more_requirements.txt
    x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1
    

    看看大卫·沃勒夫的。您只需设置一个cron作业,以保留所需软件包的公司或团队范围的镜像,然后将您的PIP指向内部镜像。

    我最近将其安装到我的开发团队的Vagrant配置中,以便其软件包缓存位于主机的文件系统上。这允许每个虚拟机拥有自己的devpi服务器守护进程,它将其用作virtualenv/pip的索引url。当虚拟机被销毁和重新配置时,软件包不必反复下载。每个开发人员下载它们一次,以便在主机文件系统上构建本地缓存

    我们还为我们的私有包提供了一个内部PyPi索引,目前它只是Apache提供服务的一个目录。最后,我将把它转换成一个devpi代理服务器,这样我们的构建服务器除了托管我们的私有库之外,还将为我们的Python依赖项维护一个包缓存。这将在我们的开发环境、生产部署和公共PyPi之间创建一个额外的缓冲区


    这似乎是迄今为止我发现的满足这些需求的最健壮的解决方案

    就我个人而言,当我需要编写(重复)创建virtualenv的脚本时,我只是为我想要的包构建.egg文件,并将它们与脚本一起签入repo以创建virtualenv。然而,我并不声称自己是大型python团队的一员,这看起来是一个非常好的选择。不过,您的示例pip.conf是不正确的——不应该有缩进或pip与
    ConfigParser.parsingeror:F一起消失
    
    $ terrarium key requirements.txt more_requirements.txt
    x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1