缓存

在版本 6.0 中添加。

pip 提供默认开启的缓存,旨在减少重复下载和构建所需的时间。

什么是缓存的

HTTP 响应

此缓存的功能类似于网页浏览器的缓存。

在进行任何 HTTP 请求时,pip 将首先检查其本地缓存以确定是否存储了该请求的合适响应,并且该响应尚未过期。如果找到,则返回该响应,并且不会重新下载内容。

如果存储了响应,但已过期,则 pip 将尝试进行条件请求以刷新缓存,该请求将返回空响应(告诉 pip 只使用缓存的项目并刷新过期计时器),或者返回全新的响应,pip 可以将其存储在缓存中。

虽然此缓存尝试最大程度地减少网络活动,但它不会完全阻止网络访问。如果您想要绕过访问 PyPI 的本地安装解决方案,请参阅 从本地包安装.

在版本 23.3 中更改: 现在使用新的缓存格式,存储在名为 http-v2 的目录中(有关此目录的位置,请参阅下文)。以前此缓存存储在主缓存目录中的名为 http 的目录中。如果您已完全切换到更新版本的 pip,您可能希望删除旧目录。

本地构建的轮子

pip 尝试尽可能地使用其本地轮子缓存中的轮子。

这意味着,如果缓存中存在与特定包名称的相同版本的轮子,pip 将使用该轮子,而不是重新构建项目。

如果找不到源分发版中的轮子,pip 将尝试使用包的构建系统构建轮子。如果构建成功,此轮子将被添加到缓存中,并在随后针对相同包版本的安装中使用。

从作为直接路径提供给 pip 的源分发版(例如 pip install .)构建的轮子不会跨运行缓存,尽管它们可能在同一个 pip 执行中重复使用。

在版本 20.0 中更改: pip 现在在从不可变 Git 引用(即提交哈希值)构建时缓存轮子。

缓存存储在何处

警告

pip 缓存的内容的确切文件系统结构被认为是实现细节,并且可能在 pip 的任何两个版本之间发生变化。

pip cache dir

在版本 20.1 中添加。

您可以使用 pip cache dir 获取 pip 当前配置为使用的缓存目录。

默认路径

~/.cache/pip

pip 还将尊重 XDG_CACHE_HOME

~/Library/Caches/pip
%LocalAppData%\pip\Cache

避免缓存

pip 尝试尽可能地使用其缓存,并且旨在默认情况下执行正确操作。

在某些情况下,pip 的缓存行为可能不可取。例如,如果您有一个带有可选 C 扩展的包,该包在无法构建 C 扩展时会生成纯 Python 轮子,即使您后来从可以构建这些可选 C 扩展的环境中调用它,pip 也会使用该缓存的轮子。这是因为 pip 看到一个与正在构建的包匹配的缓存轮子,并且 pip 假设从包索引构建包的结果是确定性的。

处理这些情况的推荐方法是从源分发版直接安装,而不是让 pip 在尝试安装时自动发现包。从源分发版直接安装将使 pip 构建轮子,无论是否存在匹配的缓存轮子。这通常意味着执行类似的操作

$ python -m pip download sampleproject==1.0.0 --no-binary :all:
$ python -m pip install sampleproject-1.0.0.tar.gz
$ python -m pip download sampleproject==1.0.0 --no-binary :all:
$ python -m pip install sampleproject-1.0.0.tar.gz
C:> py -m pip download sampleproject==1.0.0 --no-binary :all:
C:> py -m pip install sampleproject-1.0.0.tar.gz

使用 pip cache 命令删除有问题的缓存轮子也是一个好主意。

缓存管理

可以使用 pip cache 命令来管理 pip 的缓存。

一般概述

pip cache info 提供了 pip 缓存内容的概述,例如其各个部分的总大小和位置。

删除单个包

pip cache remove setuptools 从 pip 的缓存中删除与 setuptools 相关的所有轮子文件。目前不会删除 HTTP 缓存文件。

删除缓存

pip cache purge 将清除 pip 的轮子和 HTTP 缓存中的所有文件。

列出缓存的文件

pip cache list 将列出 pip 缓存中的所有轮子文件。

pip cache list setuptools 将列出 pip 缓存中所有与 setuptools 相关的轮子文件。

禁用缓存

通过传递 --no-cache-dir 选项可以禁用 pip 的缓存行为。

但是,除非您在更高级别有缓存(例如,容器构建中的分层缓存),不建议禁用 pip 的缓存。这样做会导致 pip 速度明显变慢(由于重复操作和包构建),并导致网络使用量明显增加。