我在不同的virtualenv环境中安装了很多相同的软件包。有没有办法我可以下载一次包然后从本地缓存安装pip?
这会减少下载带宽和时间。
答案 0 :(得分:122)
从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
PIP_DOWNLOAD_CACHE
目录中。例如,我现在有很多Django包。 virtualenvs
的答案,但它仍然很棒。答案 1 :(得分:50)
在我看来,pip2pi
是解决这个问题的更优雅,更可靠的解决方案。
来自文档:
pip2pi从pip要求构建与PyPI兼容的包存储库
pip2pi
允许您使用两个简单的命令创建自己的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
从上一个目录构建包索引:
$ 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中构建的索引进行安装,只需使用:
pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
您甚至可以使用pip2pi
将自己的索引镜像到远程主机。
答案 2 :(得分:31)
较新的Pip版本现在默认缓存下载。请参阅此文档:
https://pip.pypa.io/en/stable/reference/pip_install/#caching
创建名为~/.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-cache
和pip 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
是包下载到的目录的路径。