如何使用pip从本地caching安装?

我在不同的virtualenv环境中安装了很多相同的软件包。 有没有一种方法可以下载一个包,然后从本地caching进行pip安装?

这将减less下载带宽和时间。

更新的答案19-Nov-15

根据Pip文件 :

从v6.0开始,pip提供了一个默认的caching,其function类似于Web浏览器。 默认情况下,高速caching处于打开状态,默认设置为正确,但可以禁用高速caching,并始终使用--no-cache-dir选项访问PyPI。

因此,如果你想要一个下载caching,更新后的答案就是使用pip的默认值。

原始答复

从pip消息 ,版本0.1.4:

增加了对环境variables$ PIP_DOWNLOAD_CACHE的支持,这将caching包下载,所以将来的安装不需要大量下载。 networking访问仍然是必需的,但只有一些下载将在使用时避免。

为了利用这一点,我已经添加了以下内容到我的~/.bash_profile

 export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache 

或者,如果你在Mac上:

 export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads 

笔记

  1. 如果检测到更新版本的软件包,它将被下载并添加到PIP_DOWNLOAD_CACHE目录。 例如,我现在有相当多的Django包。
  2. 这并不能消除对networking访问的需求,正如pip新闻所述 ,所以这不是在飞机上创build新的virtualenvs的答案,但它仍然很好。

在我看来, pip2pi是一个更加优雅和可靠的解决scheme。

从文档:

pip2pi从pip需求构build一个兼容PyPI的软件包存储库

pip2pi允许你使用两个简单的命令创build你自己的PyPI索引:

  1. 要镜像一个包及其所有要求,请使用pip2tgz

     $ cd /tmp/; mkdir package/ $ pip2tgz packages/ httpie==0.2 ... $ ls packages/ Pygments-1.5.tar.gz httpie-0.2.0.tar.gz requests-0.14.0.tar.gz 
  2. 从以前的目录build立一个包索引:

     $ ls packages/ bar-0.8.tar.gz baz-0.3.tar.gz foo-1.2.tar.gz $ dir2pi packages/ $ find packages/ /httpie-0.2.0.tar.gz /Pygments-1.5.tar.gz /requests-0.14.0.tar.gz /simple /simple/httpie /simple/httpie/httpie-0.2.0.tar.gz /simple/Pygments /simple/Pygments/Pygments-1.5.tar.gz /simple/requests /simple/requests/requests-0.14.0.tar.gz 
  3. 要从步骤2中build立的索引进行安装,您可以简单地使用:

     pip install --index-url=file:///tmp/packages/simple/ httpie==0.2 

您甚至可以使用pip2pi将自己的索引镜像到远程主机。

PIP_DOWNLOAD_CACHE有一些严重的问题。 最重要的是,它将下载的主机名编码到caching中,所以使用镜像变得不可能。

pipe理pip下载caching的更好方法是将“下载软件包”步骤从“安装软件包”步骤中分离出来。 下载的文件通常被称为“sdist文件”(源代码发行版),我将它们存储在$ SDIST_CACHE目录中。

最后两个步骤是:

 pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name> 

它将下载该软件包并将其放在$ SDIST_CACHE指向的目录中。 它不会安装包。 然后你运行:

 pip install --find-links=file://$SDIST_CACHE --no-index --index-url=file:///dev/null <package name> 

将软件包安装到您的虚拟环境中。 理想情况下,$ SDIST_CACHE将在您的源代码pipe理下提交。 部署到生产环境时,只需运行第二个pip命令即可安装这些软件包,而无需下载它们。

对于较新的PIP版本:

较新的点子版本现在默认caching下载。 请参阅此文档:

https://pip.pypa.io/en/stable/reference/pip_install/#caching

对于较老的PIP版本:

创build一个名为~/.pip/pip.conf的configuration文件,并添加以下内容:

 [global] download_cache = ~/.cache/pip 

在OS X上,更好的selectpath是~/Library/Caches/pip因为它遵循其他OS X程序使用的约定。

从版本6.0开始, pip现在是自己的caching:

  • DEPRECATION pip install --download-cachepip wheel --download-cache命令行标志已被弃用,function被删除。 由于pip现在自动configuration并使用它的内部HTTPcaching,取代了--download-cache ,现有选项已经--download-cache但仍然会被接受,直到它们在pip v8.0中被移除。 有关更多信息,请参阅https://pip.pypa.io/en/latest/reference/pip_install.html#caching

以上链接的更多信息:

从v6.0开始,pip提供了一个默认的caching,其function类似于Web浏览器。 默认情况下,高速caching处于打开状态,默认设置为正确,但可以禁用高速caching,并始终使用--no-cache-dir选项访问PyPI。

点轮是一个很好的select,做你想要的预编译包的额外function。 从官方文档 :

为需求(及其所有依赖)构build轮子:

$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage

现在您的/tmp/wheelhouse目录已经预编译了所有的依赖关系,因此您可以将该文件夹复制到另一个服务器,并使用以下命令安装所有内容:

$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage

请注意,并非所有的软件包都可以在机器上完全移植。 一些软件包将专门为您正在使用的Python版本,操作系统发行版和/或硬件架构而构build。 这将在文件名中指定,如64位Linux上的CPython 2.7的-cp27-none-linux_x86_64等。

只使用pip(我的版本是1.2.1),你也可以像这样build立一个本地仓库:

 if ! pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>; then pip install --download-directory="$PIP_SDIST_INDEX" <package> pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package> fi 

在第一次调用pip时,需求文件中的包在本地存储库(仅)中查找,然后从那里安装。 如果失败,pip会从通常的位置(例如PyPI)检索软件包并将其下载到PIP_SDIST_INDEX (但不会安装任何东西!)。 第一个调用是“重复”从本地索引正确安装软件包。

--download-cache创build一个本地文件名,这是一个完整的(转义的)URL,pip不能用它作为带有--find-links的索引, --find-links --download-cache会使用caching的文件。可以将此选项添加到pip的第二个调用中,但是由于索引已经作为caching的一种function,所以不一定会带来很多,例如,如果您的索引被清空,这将有所帮助。

一个简单的选项是basket

给定一个包名称,它会将它和所有的依赖关系下载到一个中心位置; 没有任何pipcaching的缺点。 这对离线使用非常有用。

你可以使用这个目录作为pip的源代码:

 pip install --no-index -f file:///path/to/basket package 

或者easy_install

 easy_install -f ~/path/to/basket -H None package 

您也可以使用它来在线时更新购物篮。

有一种新的解决scheme叫做pip-accel ,它是内置caching的pip -in替代品。

pip-accel程序是Python包pipe理器pip的一个包装。 在一个或多个需求文件的情况下,它可以加速使用pip来初始化Python虚拟环境。 它通过结合以下两种方法来实现:

  • 源分布下载被caching并用于生成源分布档案的本地索引。

  • 二进制分发用于加速安装二进制组件(如M2Crypto和LXML)的依赖关系的过程。 我们不再为每个虚拟环境重新编译这些依赖关系,而是将它们编译一次,并将结果caching为二进制* .tar.gz分发。

Paylogic使用pip-accel来快速可靠地初始化持续运行unit testing(这是开发pip-accel的原始用例之一)的持续集成从站的虚拟环境。 我们也在我们的构build服务器上使用它。

pip切换到pip-accel我们已经看到了10倍左右的速度。