Conda 是否取代了对 virtualenv 的需求?

Does Conda replace the need for virtualenv?

我最近在安装 SciPy 遇到问题后发现 Conda,特别是在我正在开发的 Heroku 应用程序上。

使用 Conda,您可以创建环境,这与 virtualenv 所做的非常相似。我的问题是:

  1. 如果我使用 Conda,它会取代对​​ virtualenv 的需求吗?如果没有,我如何将两者一起使用?我是在 Conda 中安装 virtualenv,还是在 virtualenv 中安装 Conda?
  2. 我还需要使用 pip 吗?如果是这样,我是否仍然能够在隔离环境中使用 pip 安装软件包?
  1. Conda 取代了 virtualenv。在我看来它更好。它不仅限于 Python,还可以用于其他语言。根据我的经验,它提供了更流畅的体验,尤其是对于科学包。我第一次在 Mac 上正确安装 MayaVi 是在 conda 上。

  2. 您仍然可以使用 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。

  1. Conda 在一个包中有效地结合了 pip 和 virtualenv 的功能,因此如果您使用 conda,则不需要 virtualenv。

  2. 您会惊讶于 conda 支持的软件包数量。如果还不够,可以在conda下使用pip

这是一个 link conda 页面比较 conda、pip 和 virtualenv:

https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands.

虚拟环境和 pip

我要补充一点 creating and removing conda 使用 Anaconda 的环境很简单。

> conda create --name <envname> python=<version> <optional dependencies>

> conda remove --name <envname> --all 

activated environment 中,通过 condapip 安装软件包:

(envname)> conda install <package>

(envname)> pip install <package>

这些环境与 conda's pip-like package management 密切相关,因此创建环境并安装 Python 和非 Python 包很简单。


Jupyter

此外,installing ipykernel in an environment adds a new listing in the Kernels dropdown menu of Jupyter notebooks, extending reproducible environments to notebooks. As of Anaconda 4.1, nbextensions were added,更轻松地向笔记本添加扩展程序。

可靠性

根据我的经验,conda 在安装 numpypandas 等大型库时速度更快、更可靠。此外,如果你想转移你保存的环境状态,你可以通过 sharing or cloning an env.


比较

快速浏览每个工具的功能:

Feature virtualenv conda
Global n y
Local y n
PyPI y y
Channels n y
Lock File n n
Multi-Python n y

描述

  • virtualenv 创建项目特定的本地环境,通常在每个项目的 .venv/ 文件夹中。相比之下,conda 的环境是全局的并且保存在一个地方。
  • PyPI 通过 pip 与这两种工具一起使用,但 conda 可以添加额外的频道,有时安装速度更快。
  • 遗憾的是,两者都没有官方的锁定文件,因此这两种工具的重现环境都不可靠。但是,两者都有创建固定包文件的机制。
  • Python 需要安装,运行 virtualenv,但 conda 已经随 Python 一起提供。 virtualenv 使用与安装时相同的 Python 版本创建环境。 conda 允许您使用几乎任何 Python 版本创建环境。

另请参阅

根据我的经验,conda 非常适合数据科学应用程序,是一个很好的通用环境工具。然而,在软件开发中,使用 virtualenv 进入本地的、短暂的、轻量级的环境可能会很方便。

是的,condavirtualenv 更容易安装,并且几乎可以取代后者。

安装 Conda 将使您能够根据需要创建和删除 python 环境,因此为您提供与 virtualenv 相同的功能。

对于这两种发行版,您都可以创建一个独立的文件系统树,您可以在其中根据需要安装和删除 python 包(可能使用 pip)。如果你想为不同的用例使用相同库的不同版本,或者你只是想尝试一些分发并在之后删除它以节省你的磁盘,这可能会派上用场 space.

差异:

许可协议。虽然 virtualenv 属于最自由的 MIT license, Conda 使用 3 条款 BSD 许可证。

Conda 为您提供了自己的包控制系统。这个包控制系统通常提供流行 non-python 软件的预编译版本(适用于大多数流行的系统),这可以很容易地让一些机器学习包工作。也就是说,您不必为您的系统编译优化的 C/C++ 代码。虽然这对我们大多数人来说是一种极大的解脱,但它可能会影响此类库的性能。

与 virtualenv 不同,Conda 至少在 Linux 系统上复制一些系统库。此库可能会不同步,从而导致程序行为不一致。

判决:

Conda 很棒,应该是您开始机器学习时的默认选择。它将为您节省一些时间来处理 gcc 和许多软件包。然而,Conda 并没有取代 virtualenv。它引入了一些可能并不总是需要的额外复杂性。它有不同的许可证。您可能希望避免在分布式环境或 HPC 硬件上使用 conda。

另一个新选项和我当前首选的环境启动方法 运行 是 Pipenv

目前是Python.org

官方推荐的Python打包工具

我两者都用,而且(截至 2020 年 1 月)它们有一些表面上的差异,适合我的不同用途。通过 default,Conda 更喜欢在中央位置为您管理环境列表,而 virtualenv 在当前目录中创建一个文件夹。如果你是,前者(集中式)是有意义的。进行机器学习,并且只有几个广泛的环境,您可以在许多项目中使用这些环境,并希望从任何地方跳入其中。如果您正在做具有完全不同的 lib 需求集的一次性小项目,而这些需求实际上更属于项目本身,则后者(每个项目文件夹)是有意义的。

Conda 创建的空环境大约有 122MB,而 virtualenv 的大约有 12MB,所以这是您可能不希望将 Conda 环境分散到各处的另一个原因。

最后,另一个表明 Conda 更喜欢其集中式环境的表面迹象是(同样,默认情况下)如果您确实在自己的项目文件夹中创建了一个 Conda 环境并激活了它,那么 shell 是文件夹的(太长了)绝对路径。你可以通过给它一个名字来解决这个问题,但 virtualenv 默认情况下会做正确的事情。

我希望随着两个包管理器争夺主导地位,此信息会迅速变得陈旧,但这些是截至今天的权衡:)

编辑:我在 04/2021 再次审查了情况,情况没有改变。用conda做本地目录安装还是很别扭

我在公司工作,在几个防火墙后面我没有管理员权限的机器

根据我有限的 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 中安装依赖项并不容易。

1.No,如果你使用的是 conda,则不需要使用任何其他工具来管理虚拟环境(例如 venv、virtualenv、pipenv 等)。 也许有一些 conda 没有涵盖但 virtualenv(更重量级)涵盖的边缘情况,但到目前为止我还没有遇到过。


2.Yes,您不仅仍然可以使用 pip,而且您可能不得不使用。 conda 软件包存储库包含的内容少于 pip,因此 conda install 有时无法找到您正在寻找的软件包,如果它不是数据科学软件包则更是如此。 而且,如果我没记错的话,conda 的存储库没有像 pip 那样更新为 fast/often,所以如果你想使用最新版本的包,pip 可能再次成为你唯一的选择。

注意:如果 pip 命令在 conda 虚拟环境中不可用,您必须先安装它,方法是:

conda 安装 pip

毫无疑问,Conda 有更好的 API。但是,我想谈一谈使用 conda 的负面影响,因为 conda 在其余答案中享有盛誉:

  1. Solving environment Issue - One big thorn in the rear end of conda environments. As a remedy, you get advised to not use conda-forge channel. But, since it is the most prevalent channel and some packages (not just trivial ones, even really important ones like pyspark) 仅在 conda-forge 上可用,你很快就会走投无路。

  2. Packing the environment is an issue

还有其他已知问题。 virtualenv 是一个艰难的旅程,但很少是路上的一堵墙。另一方面,IMO,conda 偶尔会有硬墙,你只需要深呼吸并使用 virtualenv