如何使用pip从本地caching安装?
我在不同的virtualenv环境中安装了很多相同的软件包。 有没有一种方法可以下载一个包,然后从本地caching进行pip安装?
这将减less下载带宽和时间。
更新的答案19-Nov-15
根据Pip文件 :
从v6.0开始,pip提供了一个默认的caching,其function类似于Web浏览器。 默认情况下,高速caching处于打开状态,默认设置为正确,但可以禁用高速caching,并始终使用
--no-cache-dir
选项访问PyPI。
因此,如果你想要一个下载caching,更新后的答案就是使用pip的默认值。
原始答复
从pip消息 ,版本0.1.4:
增加了对环境variables$ PIP_DOWNLOAD_CACHE的支持,这将caching包下载,所以将来的安装不需要大量下载。 networking访问仍然是必需的,但只有一些下载将在使用时避免。
为了利用这一点,我已经添加了以下内容到我的~/.bash_profile
:
export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache
或者,如果你在Mac上:
export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads
笔记
- 如果检测到更新版本的软件包,它将被下载并添加到
PIP_DOWNLOAD_CACHE
目录。 例如,我现在有相当多的Django包。 - 这并不能消除对networking访问的需求,正如pip新闻所述 ,所以这不是在飞机上创build新的
virtualenvs
的答案,但它仍然很好。
在我看来, pip2pi
是一个更加优雅和可靠的解决scheme。
从文档:
pip2pi从pip需求构build一个兼容PyPI的软件包存储库
pip2pi
允许你使用两个简单的命令创build你自己的PyPI索引:
-
要镜像一个包及其所有要求,请使用
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
-
从以前的目录build立一个包索引:
$ 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
-
要从步骤2中build立的索引进行安装,您可以简单地使用:
pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
您甚至可以使用pip2pi
将自己的索引镜像到远程主机。
PIP_DOWNLOAD_CACHE有一些严重的问题。 最重要的是,它将下载的主机名编码到caching中,所以使用镜像变得不可能。
pipe理pip下载caching的更好方法是将“下载软件包”步骤从“安装软件包”步骤中分离出来。 下载的文件通常被称为“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将在您的源代码pipe理下提交。 部署到生产环境时,只需运行第二个pip命令即可安装这些软件包,而无需下载它们。
对于较新的PIP版本:
较新的点子版本现在默认caching下载。 请参阅此文档:
https://pip.pypa.io/en/stable/reference/pip_install/#caching
对于较老的PIP版本:
创build一个名为~/.pip/pip.conf
的configuration文件,并添加以下内容:
[global] download_cache = ~/.cache/pip
在OS X上,更好的selectpath是~/Library/Caches/pip
因为它遵循其他OS X程序使用的约定。
从版本6.0开始, pip
现在是自己的caching:
- DEPRECATION
pip install --download-cache
和pip wheel --download-cache
命令行标志已被弃用,function被删除。 由于pip现在自动configuration并使用它的内部HTTPcaching,取代了--download-cache
,现有选项已经--download-cache
但仍然会被接受,直到它们在pip v8.0中被移除。 有关更多信息,请参阅https://pip.pypa.io/en/latest/reference/pip_install.html#caching
以上链接的更多信息:
从v6.0开始,pip提供了一个默认的caching,其function类似于Web浏览器。 默认情况下,高速caching处于打开状态,默认设置为正确,但可以禁用高速caching,并始终使用
--no-cache-dir
选项访问PyPI。
点轮是一个很好的select,做你想要的预编译包的额外function。 从官方文档 :
为需求(及其所有依赖)构build轮子:
$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
现在您的/tmp/wheelhouse
目录已经预编译了所有的依赖关系,因此您可以将该文件夹复制到另一个服务器,并使用以下命令安装所有内容:
$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage
请注意,并非所有的软件包都可以在机器上完全移植。 一些软件包将专门为您正在使用的Python版本,操作系统发行版和/或硬件架构而构build。 这将在文件名中指定,如64位Linux上的CPython 2.7的-cp27-none-linux_x86_64
等。
只使用pip(我的版本是1.2.1),你也可以像这样build立一个本地仓库:
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
创build一个本地文件名,这是一个完整的(转义的)URL,pip不能用它作为带有--find-links
的索引, --find-links
--download-cache
会使用caching的文件。可以将此选项添加到pip的第二个调用中,但是由于索引已经作为caching的一种function,所以不一定会带来很多,例如,如果您的索引被清空,这将有所帮助。
一个简单的选项是basket
。
给定一个包名称,它会将它和所有的依赖关系下载到一个中心位置; 没有任何pipcaching的缺点。 这对离线使用非常有用。
你可以使用这个目录作为pip
的源代码:
pip install --no-index -f file:///path/to/basket package
或者easy_install
:
easy_install -f ~/path/to/basket -H None package
您也可以使用它来在线时更新购物篮。
有一种新的解决scheme叫做pip-accel ,它是内置caching的pip
-in替代品。
pip-accel程序是Python包pipe理器pip的一个包装。 在一个或多个需求文件的情况下,它可以加速使用pip来初始化Python虚拟环境。 它通过结合以下两种方法来实现:
源分布下载被caching并用于生成源分布档案的本地索引。
二进制分发用于加速安装二进制组件(如M2Crypto和LXML)的依赖关系的过程。 我们不再为每个虚拟环境重新编译这些依赖关系,而是将它们编译一次,并将结果caching为二进制* .tar.gz分发。
Paylogic使用pip-accel来快速可靠地初始化持续运行unit testing(这是开发pip-accel的原始用例之一)的持续集成从站的虚拟环境。 我们也在我们的构build服务器上使用它。
从pip
切换到pip-accel
我们已经看到了10倍左右的速度。