应该使用conda还是conda-forge来创建Python环境?

232

Condaconda-forge 都是 Python 的包管理器。如果一个包同时存在于这两个仓库中,应该选择哪一个?例如 Django 可以通过这两个管理器安装,但是两者之间存在几个依赖项的差异(conda-forge 拥有更多)。并没有对这些差异进行解释,甚至没有一个简单的 README。

应该使用哪一个?Conda 还是 conda-forge?这有关系吗?


27
"Conda和conda-forge都是Python包管理器。" 我不认为这是正确的。我认为它们甚至不属于同一类别的东西。conda是一个包管理器,而conda-forge是一个频道。也许在提出这个问题时是正确的?" - endolith
5个回答

358
短答案是,根据我的经验,通常使用哪个都无所谓。
长答案:
因此,conda-forge 是另一个可以安装软件包的渠道。从这个意义上说,它并不比默认渠道或其他数百(千?)个人发布软件包的渠道更特殊。如果您在https://anaconda.org注册并上传自己的 Conda 软件包,就可以添加自己的渠道。
在这里,我们需要区分一下,我认为您在问题陈述中并不清楚的是,conda 是跨平台软件包管理器,conda-forge 是软件包渠道。Anaconda Inc.(以前是 Continuum IO)作为 conda 软件的主要开发者,还维护着一个单独的软件包渠道,在不更改任何选项的情况下,这是默认的渠道。
有三种方法可以更改渠道的选项。前两种方法每次安装软件包时都要执行,而最后一种方法是持久性的。第一种方法是每次安装软件包时指定渠道:
conda install -c some-channel packagename

当然,该包必须存在于该频道上。这种方式将从 some-channel 安装 packagename 及其所有依赖项。或者,您可以指定:
conda install some-channel::packagename

该软件包仍需存在于 some-channel 中,但现在只会从 some-channel 中拉取 packagename。任何其他满足依赖关系所需的软件包将从您默认的频道列表中搜索。

要查看您的频道配置,可以输入:

conda config --show channels

你可以使用conda config来控制频道的搜索顺序。你可以写成:
conda config --add channels some-channel

将频道some-channel添加到channels配置列表的顶部。这将为some-channel赋予最高优先级。优先级确定了当有多个频道具有特定包时选择哪个频道(在某种程度上)。要将频道添加到列表末尾并赋予其最低优先级,请键入

conda config --append channels some-channel

如果您想要删除已添加的频道,可以通过编写以下内容来实现。
conda config --remove channels some-channel

看见
conda config -h

请点击此处以获取更多选项。

总的来说,有四个主要原因可以使用由conda-forge维护的conda-forge频道,而不是Anaconda维护的defaults频道:

  1. conda-forge 上的软件包可能比 defaults 渠道上的软件包更新
  2. conda-forge 渠道上有一些在 defaults 上不可用的软件包
  3. 您更喜欢使用来自 conda-forge 的依赖项(例如 openblas)而不是来自 defaultsmkl
  4. 如果您正在安装需要编译库的软件包(例如 C 扩展或围绕 C 库的包装器),则在单个渠道的环境中安装所有软件包可能会减少不兼容性的机会,因为基本 C 库的二进制兼容性(但此建议可能已过时/将来会发生变化)。有关参考,请参见 Conda Forge 关于混合渠道的文章

2
谢谢!我有两个相关的问题:
  1. 我怎样才能找到一个好的频道来尝试;
  2. 在我配置了一个频道之后,如何将其重置回默认设置?
- Daniel
1
@Kenny 针对你的第一个问题,你应该去 https://anaconda.org 上搜索你想要的包,并查看哪些渠道有这个包。我已经编辑了答案来回答你的第二个问题。不过,我还想指出,如果你想从一个渠道安装单个包,使用conda install -c some-channel packagename的方式编写命令可能会更容易些。 - darthbith
太好了!在conda-forge和conda之间是否有可用的比较,例如支持的模块数量、新鲜度、覆盖范围等? - Rutger Hofste
2
“mkl”不比“openblas”更快吗? - endolith
6
也许,但是1)可能仅限于英特尔处理器,2)它不是开源的。 - darthbith
显示剩余2条评论

49
Anaconda已经更改了他们的服务条款,因此“重度商业用户”将需要支付费用,这不包括conda-forge频道。 main频道由Anaconda维护,而conda-forge由软件包的维护者自己维护。它们各有优缺点。在main频道上的软件包通常彼此兼容,这意味着您可以安装几乎任何您想要的软件包,并且不会有依赖冲突。另一方面,conda-forge频道上的软件包比main频道上的软件包更新得快得多,因为维护者们自己将更新推送到频道。不时地,Anaconda对main频道上可用的软件包进行修补,这些修补程序不受软件包的维护者支持和完成,这可能是好事或坏事,但绝对不在维护者的控制之内,也不受其支持。
如果您不想为使用付费并且您可以接受pypi上可用的版本,则可能希望坚持使用conda-forge。如docs所述:
conda config --add channels conda-forge
conda config --set channel_priority strict
conda install <package-name>

你也可以使用miniforge,默认通道为conda-forge,支持ppc64le和aarch64平台以及其他常见平台。
如果已安装conda并想要删除默认通道,则可以使用:
conda config --show channels

查看您的频道,并可以使用{{}}。

conda config --remove channels channel-name

移除一个频道。


1
你确定使用 conda-forge 作为默认的 channel 可以消除服务条款违规吗?我听说因为基础的 conda 在安装时使用默认 channel,所以仍可能存在问题,你有何想法? - user3358152
这是一个很好的观点,我也不确定。如果想要保险起见,可以随时退而使用miniforge - adrin
@adrin,Miniconda 商业使用是否免费? - Yousef Saber
2
Reddit上的pwang99(我相信他是当前Anaconda的CEO)确认,Miniconda是Anaconda的免费替代品:https://www.reddit.com/r/Python/comments/lvr85n/i_want_to_use_python_commercially_for_free_is/gqiae2i?utm_source=share&utm_medium=web2x&context=3 - KBurchfiel
1
@YousefSaber Miniconda仍然从默认的Anaconda Cloud渠道获取资源,这些渠道属于ToS。您需要根据此帖子更新渠道,然后更新软件包以从非默认渠道重新获取资源。或者直接从Miniforge或其变体开始。 - merv
显示剩余6条评论

8

conda-forge频道是你可以找到已经为conda构建但尚未成为官方Anaconda发行版的软件包的地方。

通常来说,你可以使用其中任何一个。


0
根据我的经验,频道 conda-forge 提供了更多的软件包,并且它们也更加更新。这就是为什么我将其作为默认频道使用的原因,可以像这样完成。
conda config --add channels conda-forge
conda config --set channel_priority strict

-5

有一些Python库,你不能通过简单的conda install安装,因为它们的渠道不可用,除非你应用conda-forge。从我的经验来看,pip更通用,可以查找不同的渠道来源,而不是conda。 例如,如果你想安装python-constraint,你可以通过pip install来完成,但是要通过**cond **安装它,你必须指定渠道-conda-forge

conda install -c conda-forge python-constraint // works

但不包括

conda install python-constraint

4
安装 pip 包会使其脱离 conda 的包管理和依赖验证,这意味着您需要手动管理它(以及其可能的依赖项),而 conda update --all 等命令将不会更新已安装的 pip 包。请注意,本翻译只修改了语言表达,没有改变原意,并且不提供额外解释或其他内容。 - Jean Monet
7
这个回答给出了错误的建议。在同一环境中交错使用conda和pip命令是不好的实践。除非特定的Python包在conda格式中不可用,否则请专门使用conda install安装所有软件包。然后,作为最后的选择,请使用pip,因为pip将不会将该软件包添加到该环境的conda软件包索引中。在构建环境时使用conda,然后pip,然后conda,然后pip,然后conda等会最终导致一个损坏的conda环境索引。 - Rich Lysakowski PhD
@RichLysakowskiPhD 在哪里建议在同一环境中交错使用conda和pip命令的答案? -JeanMonet:答案并不偏向于其中任何一个。它是关于如何指定通道“conda-forge”有时会有帮助的。 - ewalel
1
原帖提到了使用conda或conda-forge,那么为什么你要提供关于“pip”包管理器的答案呢?@Jean Monet也提到了同时使用pip和conda的陷阱,因为conda不会更新仅在本地pip软件包索引中引用而不在conda软件包索引中的软件包。如果您从conda开始进行环境和软件包管理,请坚持使用它。在处理conda环境时,将pip软件包作为最后的手段和最后一步使用。 - Rich Lysakowski PhD
1
是的,原始问题着重于使用conda或conda-forge。显然,我在代码块内提供了示例的答案针对该问题。我的理解是,conda,conda-forge和pip都是Python包管理器。那么,在回答原始问题时,讨论pip作为一种选择的监管如何?答案并没有建议同时使用它们。就此而言,只要用户知道如何使用它们,同时使用它们并不是一项罪恶的行为。但是,我同意Jean所描述的缺点。 - ewalel

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