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

时间:2011-01-26 15:38:32

标签: virtualenv pip

我在不同的virtualenv环境中安装了很多相同的软件包。有没有办法我可以下载一次包然后从本地缓存安装pip

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

11 个答案:

答案 0 :(得分:122)

更新的答案19-Nov-15

根据Pip documentation

  

从v6.0开始,pip提供默认缓存,其功能类似于Web浏览器。虽然默认情况下缓存处于启用状态,但默认情况下设计正确,您可以禁用缓存并始终使用--no-cache-dir选项访问PyPI。

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

原始答案

来自pip news,版本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. 这并不会像pip news中所述那样消除对网络访问的需求,因此它不是在飞机上创建新virtualenvs的答案,但它仍然很棒。

答案 1 :(得分:50)

在我看来,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. 从上一个目录构建包索引:

    $ 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中构建的索引进行安装,只需使用:

    pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
    
  4. 您甚至可以使用pip2pi将自己的索引镜像到远程主机。

答案 2 :(得分:31)

对于较新的Pip版本:

较新的Pip版本现在默认缓存下载。请参阅此文档:

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

对于较旧的Pip版本:

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

[global]
download_cache = ~/.cache/pip

在OS X上,更好的选择路径是~/Library/Caches/pip,因为它遵循其他OS X程序使用的惯例。

答案 3 :(得分:28)

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

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

答案 4 :(得分:13)

version 6.0开始,pip现在可以自行缓存:

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

来自above link的更多信息:

  

从v6.0开始,pip提供默认缓存,其功能类似于Web浏览器。虽然默认情况下缓存处于启用状态,但默认情况下设计正确,您可以禁用缓存并始终使用--no-cache-dir选项访问PyPI。

答案 5 :(得分:8)

pip wheel是一个很好的选择,通过预编译软件包的额外功能来完成您想要的任务。来自official docs

  

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

     

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

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

  

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

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

答案 6 :(得分:3)

仅使用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的第二次调用中,但由于索引已经作为一种缓存,它不一定带来很多。例如,如果你的索引被清空会有所帮助。)

答案 7 :(得分:2)

更简单的选项是basket

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

然后,您可以将此目录用作pip的来源:

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

easy_install

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

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

答案 8 :(得分:2)

这个名为pip-accel的新解决方案是内置缓存的pip的替代品。

  

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

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

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

  •   
     

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

pip切换到pip-accel,我们已经看到了大约10倍的加速。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

我发现以下内容对于下载软件包然后从这些下载进行安装很有用:

pip download -d "$SOME_DIRECTORY" some-package

然后安装:

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

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