python在服务器上运行慢_关于python:PyPI很慢。 如何运行自己的服务器?

博客指出使用Pip和大量需求设置Python virtualenv时安装慢甚至失败的问题。介绍了运行自己的PyPI实例、使用镜像工具、轮询代理等多种解决方法,还提及pip缓存设置、terrarium交付虚拟环境、devpi缓存包等方案,探讨快速安装Python软件包的最佳方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当新的开发人员加入团队或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并进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值