Conda是否取代了virtualenv的需求?

311

最近我在开发Heroku应用时安装SciPy遇到了麻烦,后来我发现了Conda

通过使用Conda,您可以创建类似于virtualenv的环境。我的问题如下:

  1. 如果我使用Conda,是否会替代virtualenv? 如果不是,我该如何同时使用两者?我应该在Conda中安装virtualenv还是在virtualenv中安装Conda?
  2. 我是否仍然需要使用pip?如果是,我是否仍然能够在隔离环境中使用pip安装软件包?

如果您有兴趣在Heroku上使用conda和pip,请参考https://github.com/faph/conda-pip-buildpack。 - faph
谢谢。我注意到在github上有相当数量的用于Heroku的conda构建包。在决定使用哪个构建包时应考虑哪些因素? - Kritz
1
请注意,如果您想安装不直接从Continuum服务器获取的软件包,则仍需要使用pip。 - ali_m
1
是的,我看到他们仍在使用Django 1.8(而不是1.9)。目前我会在需要时使用conda(如scipy和numpy),并使用pip处理其他所有内容 - 但仍在conda中。 - Kritz
大多数conda Heroku构建包都源自Kenneth Reitz的构建包,我想。人们会根据自己的喜好进行调整。只需检查它们是否同时支持conda和pip,如果这是您需要的。以及它们是否支持environment.yml文件。您可以快速浏览构建包代码,以查看是否喜欢构建脚本,例如查看如何创建环境。 - faph
10个回答

223
  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>

22
在Anaconda环境中使用pip会有什么负面影响吗?是否存在这样的情况,即使通过Conda可用,您仍希望使用pip安装某个软件包? - clifgray
4
下划线或连字符是包名的一部分,与pip或conda无关。 <pip> 表示它是通过pip安装的,否则将使用conda安装。 - Mike Müller
7
“conda 知道 pip 安装的软件包”这一说法有一个重要的限制。据我了解,在 conda 虚拟环境中,pip 是独立运行的,因此 conda 无法卸载通过 pip 安装的软件包,例如: - information_interchange
3
pip和conda包含本地共享库的软件包可能会安装二进制不兼容的版本,这将导致各种本地世界故障(如sigsegv等),对于不熟悉C调试器的人来说很难调试。对于仅限于Python的软件包也是一样,只是更容易理解。 - bobah
4
您使用哪个conda频道安装了Python本身和其他软件包?我建议您对于所有支持的软件包都使用conda-forge,仅对于不可通过conda获取的软件包使用pip - Mike Müller
显示剩余5条评论

98

我同时使用Conda和virtualenv(截止到2020年1月),它们之间有一些表面上的区别,适用于不同的用途。默认情况下,Conda更喜欢在中心位置管理您的环境列表,而virtualenv则在当前目录中创建文件夹。如果您正在做机器学习并且只有几个广泛的环境可供跨多个项目使用,并希望从任何地方进入它们,则前者(集中式)是有意义的。而如果您正在进行完全不同的库要求的小型一次性项目,则后者(每个项目文件夹)是有意义的。

Conda创建的空环境约为122MB,而virtualenv的空环境约为12MB,因此这是另一个您可能不想随处散布Conda环境的原因。

最后,另一个表面上偏向于集中式环境的迹象是,如果在自己的项目文件夹中创建了Conda环境并激活它,则出现在您的shell中的名称前缀是(过长的)文件夹的绝对路径。您可以通过为其命名来解决此问题,但virtualenv默认情况下就能做到正确。

我预计这些信息会很快过时,因为这两个软件包管理器正竞争主导地位,但这就是今天的权衡 :)

编辑:我在04/2021再次审查了情况,结果没有改变。使用conda进行本地目录安装仍然不太方便。


3
好的解释! 你有没有在使用它们时遇到一些困难? 你曾经使用过 pipenv 吗? - Mikhail_Sam
1
我已经在谷歌上搜索了很长时间,这就是我一直在寻找的答案!在遇到项目中的冲突二进制文件问题后,我从pipenv切换到conda。我喜欢它用于创建可能被重复使用的大型“预设”环境,但对于一次性脚本或小型项目来说似乎过于繁重,而且我错过了pipenv甚至可以在你cd到目录时自动检测环境的功能。 - yuletide
1
Conda的一个巨大优势与你在回答中所说的相反。 "你可能不想到处散布Conda环境。" Conda集中了所有虚拟环境,而pip则将它们散布到各个地方。可以覆盖conda的集中式管理器,并将您的环境放在除“Anaconda3/envs”之外的其他位置,但必须明确指定。 - Rich Lysakowski PhD
拥有每个项目环境的价值,就像你通过virtualenv/pip获得的那样(我不能代表conda做什么或者这是否可能),是你可以在项目和环境之间保持一对一的状态(如果你愿意,可以跨git的版本进行)以便你可以实现可重复性。如果你的环境与项目没有关联,那将是一个问题。 - undefined

93

52

虚拟环境和 pip

我要补充一点,使用Anaconda创建和删除conda环境非常简单。

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

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

激活环境中,通过condapip安装软件包:
(envname)> conda install <package>

(envname)> pip install <package>

这些环境与conda的类似pip的软件包管理紧密相关,因此创建环境并安装Python和非Python软件包非常简单。


Jupyter

此外,在环境中安装ipykernel会在Jupyter笔记本的内核下拉菜单中添加一个新的列表,将可重复使用的环境扩展到笔记本中。从Anaconda 4.1开始,nbextensions被添加, 更容易地为笔记本添加扩展。

可靠性

根据我的经验,conda在安装大型库(如numpypandas)方面更快且更可靠。此外,如果您希望传输环境的保留状态,则可以通过共享克隆环境来实现。


比较

一个非详尽的、快速浏览每个工具特性的列表:

功能 virtualenv conda
全局 n y
本地 y n
PyPI y y
渠道 n y
锁定文件 n n
多Python版本 n y

描述

  • virtualenv 创建项目特定的本地环境,通常在每个项目中使用一个 .venv/ 文件夹。相比之下,conda 的环境是全局的,并保存在一个地方。
  • PyPI 通过 pip 与两种工具配合使用,但 conda 可以添加其他渠道,有时可以更快地安装。
  • 遗憾的是,两者都没有官方锁定文件,因此使用任一工具复制环境并不可靠。但是,两者都有创建固定软件包文件的机制。
  • 安装和运行 virtualenv 需要 Python,但 conda 已经附带了 Python。 virtualenv 使用安装时的相同 Python 版本创建环境。 conda 允许您使用几乎任何 Python 版本创建环境。

另请参阅

依据我的经验,conda 非常适合数据科学应用,并作为一个很好的通用环境工具。然而在软件开发中,通过使用 virtualenv 来创建本地的、短暂的、轻量级环境可能会更加方便。

这是一个关于为什么在数据科学工作中使用conda虚拟环境的好概括。 - Rich Lysakowski PhD

25
安装Conda将使您能够根据需要创建和删除Python环境,因此提供了与virtualenv相同的功能。
在两个发行版中,您都可以创建一个隔离的文件系统树,在其中可以根据需要安装和删除Python包(可能使用pip)。这可能会很方便,如果您想要在不同的用例中拥有同一库的不同版本,或者您只是想尝试一些发行版,并在保留磁盘空间的同时在之后将其删除。
区别:
许可协议。虚拟环境使用最自由的MIT许可证,而Conda使用3条款BSD许可证。
Conda为您提供他们自己的软件包控制系统。此软件包控制系统经常提供流行非python软件的预编译版本(对于大多数流行的系统),这可以轻松地获得某些机器学习包的工作方式。也就是说,您不必为系统编译优化的C/C++代码。虽然这对我们大多数人来说是一个巨大的解脱,但它可能会影响这些库的性能。
与virtualenv不同,Conda至少在Linux系统上会重复一些系统库。这些库可能会失步,导致您的程序行为不一致。
结论:

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


3
可以再详细说明一下为什么"在分布式环境或HPC硬件上使用conda可能需要避免"吗? - Oliver Hu
2
我不同意其中一些结论。 "不一致的程序行为" 是由于未正确配置程序以使用 conda 安装的软件和库所导致的。在 HPC 中,conda 在许多情况下是首选,事实上,它正在被 HPC 管理员用来替换诸如“模块”系统之类的东西。它允许用户安装的软件和更大的软件隔离,这是 HPC 上的两个重要问题。我唯一遇到的限制是许多 HPC 文件系统对目录中文件数量有硬限制,而 conda 则创建了许多数千个文件。 - user5359531
你提到了一个很好的观点,即 conda 可以处理流行的非 Python 软件包的 C/C++ 编译,这些软件包不带有自己的 Python 包装或二进制文件。据我所知,virtualenv 不具备这种能力。但是,你对于“避免在分布式环境或 HPC 硬件上使用 conda”这一结论是错误的,并且缺乏事实支持。我同意 @user5359531 的结论,即你需要学习更多关于如何配置和使用conda来处理复杂的 HPC 系统。它可以比单独使用 virtualenv 解决更多的 HPC 问题。 - Rich Lysakowski PhD

18

另一个新选项,也是我目前首选的环境安装方法是Pipenv

它目前是Python.org官方推荐的Python打包工具。


3
这引发了“嗯?pipenv是什么?”的疑问,然后我找到了https://www.reddit.com/r/Python/comments/8jd6aq/why_is_pipenv_the_recommended_packaging_tool_by/和https://sedimental.org/the_packaging_gradient.html。虽然我还不确定该用什么工具,但至少我更加了解了。我想是这样。 - matt wilkie
在观看了介绍并快速阅读了简介之后,pipenv 似乎无法管理 Python 版本... - Neithan Max
警告:https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-delivers-very-little/ - user76284
2
conda 几乎总是机器学习的更好选择,应尽可能使用。在 conda 环境中使用 pip 并重复安装可能会出现混合软件包的问题。pip 安装东西到 conda 环境后不会进行完整的环境完整性检查。它只检查自己的依赖项,而不检查环境中每个其他软件包的依赖项。因此,最好先将所有 conda 格式的软件包安装到 conda 环境中,然后将 pip 软件包安装到新环境中以"死路"结束。pip 不会更新 conda 的软件包索引。 - Rich Lysakowski PhD
2
它目前是Python.org官方推荐的Python打包工具。信任,但要验证。你有这个声明的来源链接吗? - Alexander
显示剩余5条评论

7
Conda无疑拥有更好的API。但是,我想谈谈使用conda的负面影响,因为在其他答案中conda已经展现了其光辉的一面:
  1. 解决环境问题 - Conda环境中一个大问题。作为解决方法,建议不使用conda-forge渠道。但是,由于它是最流行的渠道,并且一些软件包(不仅仅是琐碎的,甚至是像pyspark这样非常重要的软件包)仅在conda-forge上提供,您很快就会被困住。

  2. 打包环境是个问题

还有其他已知的问题。virtualenv是一场艰苦的旅程,但很少会遇到路上的障碍。另一方面,我认为conda偶尔会出现一些难以逾越的障碍,您只能深呼吸并使用virtualenv。


5
1. 如果您使用conda,则不需要使用任何其他工具来管理虚拟环境(例如venv、virtualenv、pipenv等)。也许有一些极端情况,conda无法覆盖,但是我迄今为止没有遇到过。
2. 是的,你不仅可以继续使用pip,而且你可能不得不使用它。conda软件包库包含比pip更少的软件包,因此conda install有时找不到您要查找的软件包,特别是如果它不是一个数据科学软件包。并且,如果我记得正确的话,conda的软件包库更新速度没有pip快/频繁,因此,如果您想使用软件包的最新版本,pip可能再次成为您唯一的选择。
注:如果在conda虚拟环境中不存在pip命令,则必须先安装它,方法是键入:
conda install pip

2

是的,conda 的安装比 virtualenv 更加容易,而且基本上可以替代后者。


6
如果Anaconda替代了它们,为什么还要提供安装虚拟环境的说明? - Natsfan
2
@jmh Anaconda并不是替代虚拟环境的工具,而是用一个更加通用的虚拟环境管理工具“conda”来替换了Python专用的虚拟环境管理工具“virtualenv”。此外,Anaconda只是一个包含Conda工具的Python+发行版;这个问题(和答案)只与Conda有关。 - merv
6
这个回答并没有比多年前的答案提供更多的信息。 - merv

-1

我在公司工作,身处多重防火墙之后,使用的机器没有管理员权限。

在我有限的 Python 经验(2 年)中,我遇到了一些库(JayDeBeApi、sasl),当通过 pip 安装时,会抛出 C++ 依赖项错误 error: 需要 Microsoft Visual C++ 14.0。请使用“Microsoft Visual C++ Build Tools”获取:http://landinghub.visualstudio.com/visual-cpp-build-tools

这些库可以通过 conda 正常安装,因此自那时起,我开始使用 conda 环境进行工作。 然而,停止 conda 在我没有写入权限的 c.programfiles 中安装依赖项并不容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接