混合使用 Conda 和 Pip

量化课堂 量化课堂
2023年9月1日 10:57

当 conda 和 pip 一起使用来创建环境时,可能会出现问题,尤其是当工具多次交叉使用时,建立了难以重现的状态。这些问题大多数因为 conda 与其他包管理器一样,控制未安装的包的能力有限。在 pip 之后运行 conda 可能会覆盖并破坏 pip 安装的包。同样,pip 可能会升级或删除 conda 安装的软件包。有时这些破坏是表面的,留存了一些本应删除的文件;更糟的情况下,环境可能会变的不可用。

有几个步骤可以用来避免在一起使用 conda 和 pip 时破坏环境。一种万无一失的方法是仅使用 conda 包。如果需要的软件没有 conda 包,可以使用 conda build 为所述软件创建包。对于 PyPI 上的项目,conda skeleton 命令(conda-build 的一部分)生成一个 recipe,只需很少或无需修改,即可创建一个 conda 包。

为所有包创建 conda 包是安全可靠的办法,但如果涉及大量仅在 PyPI 上才有的包,可能会带来较大工作量。在这些情况下,只在通过 conda 安装满足要求后,才使用 pip 是最安全的做法。此外,pip 应该使用“–-upgrade-strategy only-if-needed”参数运行,以防止对 conda 安装的包进行了不必要地升级。only-if-needed 是运行 pip 时的默认设置,保持其默认即可。

如果期望同时使用 pip 和 conda 包安装软件,最好使用一个新的专门的 conda 环境中,以保护其他环境免受 pip 修改。conda 支持创建多个隔离环境,并可以在其中安装不同版本的包。在 conda 环境中,尽可能使用硬链接,而不是复制文件以节省空间。如果安装了一组类似的包,则每个新的 conda 环境只需要少量的额外磁盘空间。许多用户仅使用 conda 安装后的默认环境,如果此环境因 pip 和 conda 混用而变得混乱,则更难恢复。如果单独创建了 conda 环境,则后续可以轻松删除和重新创建环境,而不会影响其他功能。

使用 pip 将软件安装到 conda 环境中,conda 并不知道这些更改,并且后续可能会继续进行破坏性修改。与其运行 conda、运行 pip、运行 conda,不如先创建一个具有组合 conda 要求的新环境,然后再运行 pip,可以在删除旧环境之前测试此新环境。主要是 pip 的“状态性”导致了问题,由于软件包安装顺序而存在的状态越多,保持正常就越困难。

对于需求包固定的环境,最好将 conda 和 pip 包要求存储在文本文件中。包需求可以通过 --file 参数提供给 conda,通过 -r 提供给 pip。可以先导出一个同时包含 conda 和 pip 要求的文件,然后将其提供给 conda env 命令以创建环境。这样做的优点是,环境描述文件可以纳入版本管理系统并与其他人共享。

综上所述,在混用 conda 和 pip 时,最好使用隔离的 conda 环境。只有在使用 conda 安装了尽可能多的软件包后,才使用 pip 安装剩余的软件。如果需要对环境修改,最好创建一个新环境,而不是在运行 pip 之后运行 conda。方便的话,conda 和 pip 的包需求应存储在文本文件中。

我们意识到了将 pip 和 conda 结合起来的困难,所以我们一直在添加功能,以便让设置数据科学环境过程尽可能简单。conda 4.6.0 将允许 conda 考虑 pip 安装的软件包,并根据需要替换这些软件包,或满足对现有软件包的依赖关系。我们仍在测试这些新功能,但预计 conda 和 pip 之间的交互将在不久的将来得到极大的改善。

最佳实践列表

先使用 Conda 再使用 pip

  • 使用 Conda 安装尽可能多的需求,然后使用 pip
  • 使用 pip 安装时 –-upgrade-strategy 参数应当设置为 only-if-needed(默认)
  • 不要将 pip 与 –-user 参数一起使用,避免为所有用户安装

使用 conda 环境进行隔离

  • 创建一个新的 conda 环境来隔离 pip 所做的任何更改
  • 由于硬链接特性,环境占用的空间很小
  • 应注意避免在默认的 conda 环境下运行 pip

如果需要更改,请重新创建环境

  • 一旦使用 pip,conda 将不知道这些变化
  • 要安装其他 Conda 软件包,最好重新创建环境

将 conda 和 pip 要求存储在文本文件中

  • 包要求可以通过 --file 参数传递给 conda
  • pip 接受带有 -r 或 --requirement 的 Python 包列表
  • conda env 能够根据 conda 和 pip 的包需求文件导出或创建环境
评论
暂无评论