我最近在安装 SciPy 时发现了 Conda,特别是在我正在开发的 Heroku 应用程序上。
使用 Conda,您可以创建环境,这与 virtualenv 所做的非常相似。我的问题是:
如果我使用 Conda,它会取代对 virtualenv 的需求吗?如果没有,我如何将两者一起使用?我是在 Conda 中安装 virtualenv,还是在 virtualenv 中安装 Conda?我还需要使用 pip 吗?如果是这样,我仍然可以在隔离环境中使用 pip 安装软件包吗?
Conda 取代了 virtualenv。在我看来,它更好。它不仅限于 Python,还可以用于其他语言。根据我的经验,它提供了更流畅的体验,尤其是对于科学包。我第一次在 Mac 上正确安装 MayaVi 是使用 conda。你仍然可以使用 pip。事实上,conda 在每个新环境中都会安装 pip。它知道 pip 安装的软件包。
例如:
conda list
列出当前环境中所有已安装的软件包。 Conda 安装的软件包显示如下:
sphinx_rtd_theme 0.1.7 py35_0 defaults
并且通过 pip
安装的具有 <pip>
标记:
wxpython-common 3.0.0.0 <pip>
简短的回答是,您只需要 conda。
Conda 有效地将 pip 和 virtualenv 的功能组合在一个包中,因此如果您使用 conda,则不需要 virtualenv。您会惊讶于 conda 支持的软件包数量。如果还不够,可以在conda下使用pip。
以下是比较 conda、pip 和 virtualenv 的 conda 页面的链接:
https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands。
我同时使用了两者,并且(截至 2020 年 1 月)它们有一些表面上的差异,这对我来说有不同的用途。默认情况下,Conda 更喜欢在中央位置为您管理环境列表,而 virtualenv 在当前目录中创建一个文件夹。如果您正在做机器学习并且只有几个广泛的环境可以在许多项目中使用并希望从任何地方跳入它们,那么前者(集中式)是有意义的。如果您正在执行具有完全不同的 lib 需求集且真正属于项目本身的小型一次性项目,则后者(每个项目文件夹)是有意义的。
Conda 创建的空环境大约为 122MB,而 virtualenv 大约为 12MB,因此这是您可能不希望将 Conda 环境分散在各处的另一个原因。
最后,Conda 更喜欢其集中式环境的另一个表面迹象是(同样,默认情况下)如果您确实在自己的项目文件夹中创建了一个 Conda 环境并激活它,那么出现在您的 shell 中的名称前缀是(太长)绝对文件夹的路径。你可以通过给它一个名字来解决这个问题,但 virtualenv 默认情况下会做正确的事情。
我希望随着这两个包管理器争夺主导地位,这些信息会迅速变得陈旧,但这些是今天的权衡:)
编辑:我在 2021 年 4 月再次审查了情况,情况没有改变。使用 conda 进行本地目录安装仍然很尴尬。
pipenv
吗?
虚拟环境和pip
我要补充一点,Anaconda 的 creating 和 removing conda
环境很简单。
> conda create --name <envname> python=<version> <optional dependencies>
> conda remove --name <envname> --all
在 activated environment 中,通过 conda
或 pip
安装软件包:
(envname)> conda install <package>
(envname)> pip install <package>
这些环境与 conda's pip-like package management 紧密相关,因此创建环境和安装 Python 和非 Python 包都很简单。
木星
此外,环境中的 installing ipykernel
在 Jupyter 笔记本的内核下拉菜单中添加了一个新列表,将可重现的环境扩展到笔记本。从 Anaconda 4.1 开始,nbextensions were added,更容易向笔记本添加扩展。
可靠性
根据我的经验,conda
在安装大型库(例如 numpy
和 pandas
)时更快、更可靠。此外,如果您希望转移您保存的环境状态,您可以通过 sharing 或 cloning 一个 env 来实现。
比较
快速浏览每个工具的功能:
特性 virtualenv conda 全局 ny 本地 yn PyPI yy 通道 ny 锁定文件 nn 多 Python ny
描述
virtualenv 通常在每个项目的 .venv/ 文件夹中创建项目特定的本地环境。相比之下,conda 的环境是全局的并且保存在一个地方。
PyPI 通过 pip 与这两种工具一起工作,但 conda 可以添加额外的通道,有时可以更快地安装。
遗憾的是,两者都没有正式的锁定文件,因此这两种工具的复制环境都不是很稳定。但是,两者都有创建固定包文件的机制。
安装和运行 virtualenv 需要 Python,但 conda 已经随 Python 一起提供。 virtualenv 使用与它安装时相同的 Python 版本创建环境。 conda 允许您使用几乎任何 Python 版本创建环境。
也可以看看
virtualenvwrapper:全局虚拟环境
pyenv:管理python版本
曼巴:“更快”的康达
根据我的经验,conda
非常适合数据科学应用程序,并且可以作为一个很好的通用环境工具。然而,在软件开发中,使用 virtualenv
放入本地的、临时的、轻量级的环境中可能会很方便。
安装 Conda 将使您能够根据需要创建和删除 python 环境,从而为您提供与 virtualenv 相同的功能。
在这两个发行版的情况下,您将能够创建一个隔离的文件系统树,您可以在其中安装和删除 python 包(可能使用 pip)。如果您想为不同的用例使用不同版本的同一库,或者您只是想尝试一些分发并在之后删除它以节省磁盘空间,这可能会派上用场。
差异:
许可协议。虽然 virtualenv 属于最自由的 MIT license,但 Conda 使用 3 条款 BSD 许可证。
Conda 为您提供了自己的包控制系统。这个包控制系统通常提供流行的非 python 软件的预编译版本(对于大多数流行的系统),这可以很容易地让一些机器学习包工作。也就是说,您不必为您的系统编译优化的 C/C++ 代码。虽然这对我们大多数人来说是一种极大的解脱,但它可能会影响此类库的性能。
与 virtualenv 不同,Conda 至少在 Linux 系统上复制了一些系统库。此库可能会不同步,从而导致程序的行为不一致。
判决:
Conda 很棒,应该是您开始机器学习时的默认选择。它将为您节省一些时间来处理 gcc 和众多软件包。然而,Conda 并没有取代 virtualenv。它引入了一些可能并不总是需要的额外复杂性。它来自不同的许可证。您可能希望避免在分布式环境或 HPC 硬件上使用 conda。
conda
安装的软件和库的结果。在 HPC 中,conda
在许多情况下更可取,事实上,HPC 管理员正在使用它来替换 module
系统之类的东西。它允许用户安装软件和更大的软件隔离,这是 HPC 的两个大问题。我遇到的唯一警告是,许多 HPC 文件系统对目录中的文件数量有硬性限制,而 conda 创建了许多 1,000 个文件。
conda
处理流行的非 Python 软件 Python 软件包的 C/C++ 编译提出了一个很好的观点,这些 Python 软件包不附带 Python 包装器或它们自己的二进制文件。 AFAIK virtualenv
不这样做。但是,您关于“避免在分布式环境或 HPC 硬件上使用 conda”的结论是有缺陷的,并且没有事实支持。我同意 @user5359531 的结论,即您必须了解有关为复杂 HPC 系统配置和使用 conda
的更多信息。它可以解决比单独使用 virtualenv 更多的 HPC 问题。
另一个新选项和我当前启动和运行环境的首选方法是 Pipenv
目前是 Python.org 官方推荐的 Python 打包工具
pipenv --two
用于 Python2 和 pipenv --three 用于 python3
1.不,如果您使用的是conda,则不需要使用任何其他工具来管理虚拟环境(例如venv、virtualenv、pipenv等)。也许有一些 conda 没有涵盖但 virtualenv (更重量级)可以涵盖的边缘情况,但到目前为止我还没有遇到过。
2.是的,你不仅仍然可以使用 pip,而且你可能不得不这样做。 conda 包存储库包含的内容少于 pip 的内容,因此 conda install 有时无法找到您要查找的包,如果它不是数据科学包则更是如此。而且,如果我没记错的话,conda 的存储库不会像 pip 那样快速/经常更新,所以如果你想使用最新版本的包,pip 可能再次成为你唯一的选择。
注意:如果 pip 命令在 conda 虚拟环境中不可用,您必须先安装它,方法是点击:
康达安装点子
毫无疑问,Conda 有更好的 API。但是,我想谈谈使用 conda 的负面影响,因为 conda 在其他答案中也有它的荣耀:
解决环境问题 - conda 环境后端的一大刺。作为补救措施,建议您不要使用 conda-forge 频道。但是,由于它是最流行的渠道,并且某些软件包(不仅是琐碎的,甚至像 pyspark 这样非常重要的软件包)仅在 conda-forge 上可用,因此您很快就会陷入困境。包装环境是个问题
还有其他已知问题。 virtualenv 是一段艰难的旅程,但很少会在路上一堵墙。另一方面,IMO 的 conda 偶尔会有这些硬墙,您只需要深呼吸并使用 virtualenv
是的,conda
比 virtualenv
更容易安装,并且几乎取代了后者。
conda
替换特定于 Python 的虚拟环境管理工具 virtualenv
。此外,Anaconda 只是一个包含 Conda 工具的 Python+ 发行版;问题(和答案)仅与康达有关。
我在公司工作,在几个防火墙后面,我没有管理员权限
在我有限的 python 经验(2 年)中,我遇到了几个库(JayDeBeApi,sasl),当通过 pip 安装时抛出 C++ 依赖错误错误:需要 Microsoft Visual C++ 14.0。使用“Microsoft Visual C++ Build Tools”获取它:http://landinghub.visualstudio.com/visual-cpp-build-tools
这些在 conda 上安装得很好,因此从那时起我就开始使用 conda env。但是,要阻止 conda 在我没有写访问权限的 c.programfiles 中安装依赖项并不容易。
不定期副业成功案例分享
<pip>
表明它是用 pip 安装的,否则它是用 conda 安装的。conda-forge
用于支持的所有内容,而将pip
仅用于无法通过 conda 获得的内容。