我在不同的 虚拟世界环境中安装了许多相同的软件包。有没有一种方法,我可以下载一次软件包,然后有 Pip安装从一个本地缓存?
这将减少下载带宽和时间。
根据 Pip 文档:
从 v6.0开始,pip 提供了一个默认打开的缓存,其功能类似于 Web 浏览器。当缓存默认打开且设计正确时,您可以通过使用 --no-cache-dir选项禁用缓存并始终访问 PyPI。
--no-cache-dir
因此,如果需要下载缓存,更新后的答案是只使用 pip 及其默认值。
来自 最新消息版本0.1.4:
增加了对环境变量 $PIP _ DOWNLOAD _ CACHE 的支持,该变量将缓存软件包下载,所以以后的安装不需要大量的下载。网络访问仍然是必需的,但只有一些下载时,将避免使用这一点。
为了利用这一点,我在我的 ~/.bash_profile中添加了以下内容:
~/.bash_profile
export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache
或者,如果你使用的是 Mac 电脑:
export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads
PIP_DOWNLOAD_CACHE
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
来自文件:
Pip2pi 根据 pip 需求构建一个与 PyPI 兼容的包存储库
pip2pi允许您使用两个简单的命令创建自己的 PyPI 索引:
要镜像一个包及其所有需求,请使用 pip2tgz:
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
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
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(但不安装任何东西!).第一个调用是“重复的”,以便从本地索引正确安装包。
PIP_SDIST_INDEX
(--download-cache创建一个本地文件名,该文件名是完整(转义) URL,pip 不能将其用作 --find-links的索引。如果找到,--download-cache将使用缓存的文件。我们可以将这个选项添加到 pip 的第二个调用中,但是由于索引已经起到了缓存的作用,所以不一定会带来很多。例如,如果你的索引是空的,这会有所帮助。)
--download-cache
--find-links
更新的 Pip 版本现在默认缓存下载:
Https://pip.pypa.io/en/stable/topics/caching/
创建一个名为 ~/.pip/pip.conf的配置文件,并添加以下内容:
~/.pip/pip.conf
[global] download_cache = ~/.cache/pip
在 OSX 上,一个更好的选择是 ~/Library/Caches/pip,因为它遵循其他 OSX 程序使用的约定。
~/Library/Caches/pip
一个更简单的选项是 basket。
basket
给定一个包名,它将把它和所有依赖项下载到一个中心位置; 没有任何 pip 缓存的缺点。这对于离线使用非常有用。
然后您可以使用这个目录作为 pip的源:
pip
pip install --no-index -f file:///path/to/basket package
或 easy_install:
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-accel 程序是 Python 包管理器 pip 的包装器。它在给定一个或多个需求文件的情况下加速使用 pip 来初始化 Python 虚拟环境。它将以下两种办法结合起来:
源分发下载被缓存并用于生成源分发归档的本地索引。
二进制发行版用于加快安装具有二进制组件(如 M2Crypto 和 LXML)的依赖项的过程。我们没有为每个虚拟环境重新编译这些依赖项,而是将它们编译一次,然后将结果缓存为二进制 * 。Tar.gz 分布。
Paylogic 使用 pip-accel 快速可靠地初始化其持续集成奴隶农场上的虚拟环境,这些奴隶不断运行单元测试(这是 pip-accel 开发的原始用例之一)。我们也在构建服务器上使用它。
我们已经看到从 pip切换到 pip-accel的速度提高了大约10倍。
pip-accel
从 版本6.0开始,pip现在拥有自己的缓存:
DEPRECATION pip install --download-cache和 pip 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
pip install --download-cache
pip wheel --download-cache
来自 以上连结的更多信息:
Pip round 是一个非常好的选项,它可以通过预编译包的额外功能实现您想要的功能。来自 官方文件:
为需求(及其所有依赖项)构建轮子: $ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
为需求(及其所有依赖项)构建轮子:
$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
现在您的 /tmp/wheelhouse目录已经预编译了所有依赖项,因此您可以将该文件夹复制到另一台服务器,并使用以下命令安装所有内容:
/tmp/wheelhouse
$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage
请注意,并非所有的包都可以完全跨机器移植。有些软件包将专门针对 Python 版本、 OS 发行版和/或您正在使用的硬件架构构建。这将在文件名中指定,如64位 Linux 上 CPython 2.7的 -cp27-none-linux_x86_64等。
-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是要将包下载到的目录的路径。
$SOME_DIRECTORY