如何使用 pip 从本地缓存安装?

我在不同的 虚拟世界环境中安装了许多相同的软件包。有没有一种方法,我可以下载一次软件包,然后有 Pip安装从一个本地缓存?

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

67498 次浏览

更新答案19-11-15

根据 Pip 文档:

从 v6.0开始,pip 提供了一个默认打开的缓存,其功能类似于 Web 浏览器。当缓存默认打开且设计正确时,您可以通过使用 --no-cache-dir选项禁用缓存并始终访问 PyPI。

因此,如果需要下载缓存,更新后的答案是只使用 pip 及其默认值。

原始答案

来自 最新消息版本0.1.4:

增加了对环境变量 $PIP _ DOWNLOAD _ CACHE 的支持,该变量将缓存软件包下载,所以以后的安装不需要大量的下载。网络访问仍然是必需的,但只有一些下载时,将避免使用这一点。

为了利用这一点,我在我的 ~/.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. 这并不能消除网络访问的需要,如 最新消息所述,所以这不是在飞机上创建新的 virtualenvs的答案,但它仍然是伟大的。

PIP _ DOWNLOAD _ CACHE 有一些严重的问题。最重要的是,它将下载的主机名编码到缓存中,因此不可能使用镜像。

管理 pip 下载缓存的更好方法是将“下载软件包”步骤与“安装软件包”步骤分开。下载的文件通常称为“ SDIST file”(源代码分发版) ,我将把它们存储在 $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 将在源代码控制下提交。在部署到生产环境时,您将只运行第二个 pip 命令来安装包而不下载它们。

在我看来,对于这个问题,pip2pi是一个更加优雅和可靠的解决方案。

来自文件:

Pip2pi 根据 pip 需求构建一个与 PyPI 兼容的包存储库

pip2pi允许您使用两个简单的命令创建自己的 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. To build a package index from the previous directory:

    $ 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. To install from the index you built in step 2., you can simply use:

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

You can even mirror your own index to a remote host with pip2pi.

仅使用 pip (我的版本是1.2.1) ,您也可以像下面这样构建一个本地存储库:

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创建一个本地文件名,该文件名是完整(转义) URL,pip 不能将其用作 --find-links的索引。如果找到,--download-cache将使用缓存的文件。我们可以将这个选项添加到 pip 的第二个调用中,但是由于索引已经起到了缓存的作用,所以不一定会带来很多。例如,如果你的索引是空的,这会有所帮助。)

更新的 Pip 版本:

更新的 Pip 版本现在默认缓存下载:

Https://pip.pypa.io/en/stable/topics/caching/

对于老版本的 Pip:

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

[global]
download_cache = ~/.cache/pip

在 OSX 上,一个更好的选择是 ~/Library/Caches/pip,因为它遵循其他 OSX 程序使用的约定。

一个更简单的选项是 basket

给定一个包名,它将把它和所有依赖项下载到一个中心位置; 没有任何 pip 缓存的缺点。这对于离线使用非常有用。

然后您可以使用这个目录作为 pip的源:

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

easy_install:

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

您也可以使用它来更新篮子,无论何时您在线。

有一种新的解决方案称为 Pip-accel,它是内置缓存的 pip的替代品。

Pip-accel 程序是 Python 包管理器 pip 的包装器。它在给定一个或多个需求文件的情况下加速使用 pip 来初始化 Python 虚拟环境。它将以下两种办法结合起来:

  • 源分发下载被缓存并用于生成源分发归档的本地索引。

  • 二进制发行版用于加快安装具有二进制组件(如 M2Crypto 和 LXML)的依赖项的过程。我们没有为每个虚拟环境重新编译这些依赖项,而是将它们编译一次,然后将结果缓存为二进制 * 。Tar.gz 分布。

Paylogic 使用 pip-accel 快速可靠地初始化其持续集成奴隶农场上的虚拟环境,这些奴隶不断运行单元测试(这是 pip-accel 开发的原始用例之一)。我们也在构建服务器上使用它。

我们已经看到从 pip切换到 pip-accel的速度提高了大约10倍。

版本6.0开始,pip现在拥有自己的缓存:

  • DEPRECATION pip install --download-cachepip wheel --download-cache命令行标志已被弃用,功能已被删除。由于 pip 现在自动配置和使用它的内部 HTTP 缓存,取代了 --download-cache,现有的选项已经不起作用,但仍将被接受,直到它们在 pip v8.0中删除。有关详细信息,请参阅 < a href = “ https://pip.pypa.io/en/update/reference/pip _ install.html # cached”> https://pip.pypa.io/en/latest/reference/pip_install.html#caching

来自 以上连结的更多信息:

从 v6.0开始,pip 提供了一个默认打开的缓存,其功能类似于 Web 浏览器。当缓存默认打开且设计正确时,您可以通过使用 --no-cache-dir选项禁用缓存并始终访问 PyPI。

Pip round 是一个非常好的选项,它可以通过预编译包的额外功能实现您想要的功能。来自 官方文件:

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

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

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

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

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

我认为“ pip-accel”是个不错的选择。

我发现下面这些对于下载软件包然后从这些下载中安装很有用:

pip download -d "$SOME_DIRECTORY" some-package

然后安装:

pip install --no-index --no-cache-dir --find-links="$SOME_DIRECTORY"

其中 $SOME_DIRECTORY是要将包下载到的目录的路径。