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

Mat*_*kin 137 pip virtualenv

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

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

Mat*_*kin 122

更新的答案19-Nov-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
Run Code Online (Sandbox Code Playgroud)

或者,如果你在Mac上:

export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 如果检测到更新版本的软件包,它将被下载并添加到PIP_DOWNLOAD_CACHE目录中.例如,我现在有很多Django包.
  2. 这并没有消除对网络访问的需求,如点子新闻所述,所以它不是virtualenvs在飞机上创建新的答案,但它仍然很棒.

  • 也许更好的想法是把它放到.bashrc中,因为bash_profile只在登录时执行.这取决于你,无论如何这是一个很好的建议:) (4认同)
  • PIP_DOWNLOAD_CACHE存在严重缺陷,我不建议将其用于将软件包发送到部署机器之类的东西.它还依赖于pypi.python.org可以访问.非常适合本地开发缓存,但不适合较重的用途. (3认同)

K Z*_*K Z 51

在我看来,这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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 要从您在步骤2中构建的索引进行安装,您只需使用:

    pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
    
    Run Code Online (Sandbox Code Playgroud)

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


Fli*_*imm 31

对于较新的Pip版本:

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

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

对于较旧的Pip版本:

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

[global]
download_cache = ~/.cache/pip
Run Code Online (Sandbox Code Playgroud)

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


sla*_*acy 28

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

管理pip下载缓存的更好方法是将"下载包"步骤与"安装包"步骤分开.下载的文件通常称为"sdist文件"(源代码分发),我将它们存储在$ SDIST_CACHE目录中.

这两个步骤最终成为:

pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name>
Run Code Online (Sandbox Code Playgroud)

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

pip install --find-links=file://$SDIST_CACHE --no-index --index-url=file:///dev/null <package name> 
Run Code Online (Sandbox Code Playgroud)

将软件包安装到虚拟环境中.理想情况下,$ SDIST_CACHE将在您的源代码管理下提交.部署到生产时,您将只运行第二个pip命令来安装软件包而不下载它们.

  • 我使用 pip 18.1 并且选项 --no-install 不存在。关于如何更新这个答案有什么想法吗? (2认同)

Jac*_*ing 13

6.0版开始,pip现在进行自己的缓存:

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

来自以上链接的更多信息:

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


hdi*_*nes 8

pip wheel是一个很好的选择,可以通过预编译包的额外功能来实现您的需求.来自官方文档:

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

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

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

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

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


use*_*997 5

仅使用 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
Run Code Online (Sandbox Code Playgroud)

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

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