在 CONDA 环境中独占使用 PIP 有哪些陷阱?

What are the pitfalls of exclusively using PIP in a CONDA environment?

背景

同一网站的官方documentation and this blog - 建议使用conda安装尽可能多的需求,然后使用pip。显然这是因为 conda 将不知道 pip 对依赖项所做的任何更改,因此将无法正确解析依赖项。

问题

现在,如果一个人只使用 pip 并且不使用 conda 安装任何东西,那么期望 conda 似乎不需要知道 [= 所做的任何更改似乎是合理的12=] - 因为 conda 实际上成为隔离依赖项和管理版本的单纯工具。然而,这违背了官方的建议,因为人们不会 安装尽可能多的要求 conda

所以问题仍然存在:是否有任何已知的缺点 conda 中使用 pip环境?

相似主题

中的类似主题已在 触及,但未涵盖在 [=10= 中专门使用 pip 的情况] 环境。我也来过这里:

  • What is the difference between pip and conda?

不确定是否可以对此给出全面的答案,但我想到的一些主要事情是:

  1. 缺乏对非Python依赖解析的深度支持。虽然随着时间的推移,越来越多的捆绑非 Python 资源的轮子变得可用,但它远不及 Conda 作为通用包管理器而不是 Python 特定的包管理器提供的覆盖范围。对于任何进行互操作计算的人(例如,reticulate),我希望 Conda 会受到青睐。

  2. 优化库。与第一点有点相关,但 Anaconda 团队已经努力构建优化版本的包(例如,numpy 的 MKL)。不确定是否可以通过 PyPI 获得等效项。1

  3. 跨环境的冗余冗余。当包和环境位于同一卷上时,Conda 使用硬链接,并支持跨卷的软链接。这有助于最大限度地减少复制安装在多个环境中的任何包。

  4. 使导出变得复杂。导出 (conda env export) 时,Conda 不会选择所有 pip 安装的包 - 仅选择来自 PyPI 的包。也就是说,它会丢失从 GitHub 安装的东西,等等。如果确实采用 pip-only 路线,我认为更可靠的导出策略是使用 pip freeze > requirements.txt,然后制作一个YAML 喜欢

    channels:
      - defaults
    dependencies:
      - python=3.8  # specify the version
      - pip
      - pip:
        - -r requirements.txt
    

    用来重建环境。

综上所述,我可以很容易地想象出 none 这些对某些人来说很重要(大多数是为了方便),尤其是那些倾向于纯粹在 Python 中工作的人。然而,在这种情况下,我不明白为什么不干脆完全放弃 Conda 并使用 Python 特定的虚拟环境管理器。


[1]有知道的请指正