当前位置: 首页 > 知识库问答 >
问题:

PyPI是缓慢的。如何运行自己的服务器?

申自明
2023-03-14

当一个新的开发人员加入团队,或者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实现:CheeseShop以及一些第三方实现,例如:djangopypi和pypiserver(见脚注)

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

    使用Pep381客户端或pypi镜像运行PyPI镜像。

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

    使用PyPI循环代理,如yopypi。

    这是无关紧要的,因为http://pypi.python.org它本身由几个地理位置不同的服务器组成。

    在开发人员之间复制virtualenv,或托管当前项目依赖项的文件夹。

    这不能扩展:我们有几个不同的Python项目,它们的依赖关系随着时间的推移而变化(缓慢)。一旦任何项目的依赖项更改,必须更新此中心文件夹以添加新的依赖项。然而,复制虚拟环境比复制包更糟糕,因为任何带有C模块的Python包都需要为目标系统编译。我们的团队有Linux和OS X用户。

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

    使用智能PyPI缓存代理:集合。鸡蛋代理

    这似乎是一个非常好的解决方案,但是PyPI的最后一个版本是2009年,讨论了mod_python。

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

    脚注:

    • 我看到了一个问题:如何推出自己的PyPI?,但这个问题与托管私有代码有关
    • Python wiki列出了可选的PyPI实现
    • 我最近还发现了板条箱。但我不相信这对我使用Pip有帮助
    • 有一个网站监控PyPI镜像状态
    • PyPI上的一些包的文件托管在其他地方,因此即使是完美的镜像也不能帮助所有依赖项
  • 共有3个答案

    司空锋
    2023-03-14

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

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

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

    仇征
    2023-03-14

    虽然它不能解决您的PyPI问题,但将构建的虚拟环境交给开发人员(或部署)可以通过Terraria来完成。

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

    $ pip install terrarium
    $ terrarium --target testenv --storage-dir /mnt/storage install requirements.txt
    

    构建一个新鲜的环境后,terraria会对环境进行存档和压缩,然后将其复制到存储-dir指定的位置。

    在指定相同存储目录的相同需求集的后续安装中,terraria将从 /mnt/storage.复制并提取压缩归档

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

    $ terrarium key requirements.txt more_requirements.txt
    x86_64-2.6-c33a239222ddb1f47fcff08f3ea1b5e1
    
    孟晋
    2023-03-14

    你有一个共享的文件系统吗?

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

    mkdir /mnt/pip-cache
    

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

    [global]
    download-cache = /mnt/pip-cache
    

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

     类似资料:
    • 问题内容: 我想运行自己的内部pypi服务器,以便在组织内分发鸡蛋。 我发现了一些项目,例如: http://pypi.python.org/pypi/EggBasket/ http://plone.org/products/plonesoftwarecenter 据我了解,pypi.python.org使用名为Cheese Shop的软件。 我的问题: 为什么我不能使用奶酪店本身?(我找不到它,

    • 问题内容: (重要)编辑3: 单独运行testajax2.php而 不是 Ajax。持续时间大致相同,为1.02-1.03秒。所以我想这意味着问题出在PHP- MySQL或XAMPP中? 当我通过phpMyAdmin查询运行它时,结果如下:显示第0-29行(总计约50行。查询耗时 0.0015秒 )。看来问题根本不在于Ajax,而可能在于PHP。我怎样才能解决这个问题?(我也刚刚编辑了问题标题。)

    • 我已经使用了ffmpeg和mp4box来获取必要的文件,就像公会制作自己的简单MPEG-DASH服务器一样。然后,我将所有文件(包括MPD和短划线段)放入我的http服务器文件夹(我使用的是nginx,文件夹是**/wwwroot/default/)。 但我无法通过akamai player或dash if reference player等播放器播放我的视频。url是正确的,因为我可以直接使用“

    • 我只想运行一个Web项目,已在maven项目中配置了pom.xml.它使用maven tomcat7-maven-plugin部署Web应用程序工件,此时一切正常。 现在我想添加自己的服务器。xml和tomcat用户。tomcat配置中的xml。我读到我需要添加以下几行。 这很好。它现在正在工作,tomcat是使用上面的配置文件部署的,但问题是 我使用这个配置。 但是tomcat开始部署webap

    • 问题内容: 刚开始在本地服务器上试用Flask时,我注意到请求/响应时间比我预期的要慢得多。 像下面这样的简单服务器需要近5秒钟才能响应。 有任何想法吗?还是这只是本地服务器的方式? 问题答案: 在支持ipv6并进行了配置的操作系统(例如现代Linux系统,OS X 10.4或更高版本以及Windows Vista)上,如果访问本地服务器,某些浏览器可能会非常缓慢。原因是有时ipv4和ipv6套接

    • 获取未定义id的错误。如果我使用,它工作得很好。这是客户端代码: 下面是我自己的代码: 我做错了什么? 如果我使用以下代码: