pip & conda重叠怎么办?

What to do when pip & conda overlap?

我对conda installpip install的区别有一定的了解; pip 如何只安装 python 包 & conda 可以安装非 python 二进制文件。但是,这两者之间有一些重叠。这让我问:

conda还是pip都提供套餐的经验法则是什么?

例如,TensorFlow 在两个存储库中都可用,但来自 tensorflow docs:

within Anaconda, we recommend installing TensorFlow with the pip install command, not with the conda install command.

但是,还有许多其他包重叠,如 numpyscipy


然而, 建议 conda install 应该是默认的并且 pip 应该只在 conda 的包不可用时才使用。即使对于 TensorFlow 或其他仅 python 的软件包也是如此吗?

Tensorflow 维护者实际上在 PyPI 上发布了 TensorFlow 的轮子,这就是为什么它是推荐的官方方式。 conda 包由 Anaconda 员工 and/or 社区创建。这并不意味着 conda 包不好,它只是意味着 TensorFlow 维护者不参与(官方)。基本上他们只是在说:"If you have trouble installing it with pip the TensorFlow devs will try to help you. But we don't officially support the conda packages so if something goes wrong with the conda package you need to ask the conda-package maintainers. You've been warned."


在更一般的情况下:

对于仅 Python 的软件包,您应该始终使用 conda install。可能会有例外,例如,如果根本没有 conda-package 或 conda 包已过时(并且没有人发布该包的新版本)并且您确实需要它 package/version.

但是对于需要编译的包(例如 C-Extensions 等)则有所不同。这是不同的,因为使用 pip 你可以安装一个包:

  • 作为预编译轮
  • 作为包,在您的计算机上编译

而conda只是提供了

  • 编译conda包

对于已编译的包,您必须注意二进制兼容性。这意味着一个包是针对另一个库的特定二进制接口编译的——这可能取决于库的版本或编译标志等。

使用 conda,您必须按原样使用包,这意味着您必须假设包是二进制兼容的。如果不是,它将无法工作(段错误或链接错误或其他)。

如果您使用 pip 并且可以根据计算机上的 可用 库选择要安装或编译的 wheel(如果有的话)。这意味着您获得二进制不兼容的可能性较小。如果您从不同的 conda 通道安装 conda 包,那将是(或曾经是)一个大问题。因为它们可能只是二进制不兼容(例如 conda-forge 和 anaconda-channel 存在或存在一些问题)。

不过,应该根据具体情况来决定。我的 tensorflow conda 环境没有问题,我从 conda-forge 频道安装了 all 包,包括 tensorflow。但是我听说有几个人在 mixed conda-forgeanaconda 通道环境中遇到了 tensorflow 问题。例如,来自主频道的 NumPy 和来自 conda-forge 频道的 TensorFlow 可能只是二进制不兼容。

我的经验法则是:

  • 如果它是 Python-only 软件包,请安装它(不太可能造成麻烦)。尽可能使用 conda 包,但如果你使用 pip,它不会造成(很多)麻烦。如果你使用 pip 安装它,它不是由 conda 管理的,所以它可能不会被识别为可用的依赖项,你必须自己更新它,但这就是所有的区别。
  • 如果它是编译包(如 C 扩展或 C 库的包装器等),它会变得有点复杂。如果你想成为 "careful" 或者你有理由期待问题:
  • 如果您需要测试来自不同渠道的编译包,请始终创建一个新环境and/orconda 和 pip。丢弃一个乱七八糟的 conda 环境很容易,但修复一个你依赖的环境就更烦人了。
  • 如果可能,使用 conda install 一个而且只有一个 频道(如果可能的话,主要的 anaconda 频道)安装所有已编译的软件包。
  • 如果不可能,请尝试将主 anaconda 频道编译的包与来自不同频道的 conda 包混合。
  • 如果这不起作用,请尝试混合使用 conda 编译包和 pip 编译包(预编译轮或自编译安装程序)。

您询问了为什么不能使用 conda 从 PyPI 安装软件包。我不知道具体原因,但 pip 主要是提供软件包,您必须自己安装。使用 conda 你会得到一个已经编译和安装的包,它只是 "copied" 没有安装。这要求软件包安装在不同的操作系统(Mac、Windows、Linux)和平台(32 位、64 位)上,针对不同的 Python版本(2.7、3.5、3.6)并且可能针对不同的 NumPy 版本。这意味着 conda 必须提供多个包而不是一个。这需要资源(space 用于最终安装的软件包和安装时间),这些资源可能不可用或不可行。除此之外,除了您必须了解的有关包(编译、安装)以使其工作的所有细节之外,可能没有将 pypi 包转换为 conda 配方的转换器。不过这只是我的猜测。