Python 当pip&;康达重叠?

Python 当pip&;康达重叠?,python,numpy,pip,conda,Python,Numpy,Pip,Conda,我对conda安装和pip安装之间的区别有合理的理解;如何pip安装python-only包&conda可以安装非python二进制文件。然而,这两者之间有一些重叠。这让我想问: 当两者都提供套餐时,使用conda还是pip的经验法则是什么? 例如,TensorFlow在两个存储库上都可用,但可以从以下位置获得: 在Anaconda中,我们建议安装TensorFlow和 pip install命令,而不是使用conda install命令 但是,还有许多其他软件包重叠,如numpy,scipy等

我对
conda安装
pip安装
之间的区别有合理的理解;如何
pip
安装python-only包&
conda
可以安装非python二进制文件。然而,这两者之间有一些重叠。这让我想问:

当两者都提供套餐时,使用
conda
还是
pip
的经验法则是什么?

例如,
TensorFlow
在两个存储库上都可用,但可以从以下位置获得:

在Anaconda中,我们建议安装TensorFlow和
pip install
命令,而不是使用
conda install
命令

但是,还有许多其他软件包重叠,如
numpy
scipy



但是,建议默认使用
conda安装
,&
pip
仅在
conda
中没有软件包时使用。即使对于
TensorFlow
或其他仅使用python的软件包也是如此吗?

TensorFlow的维护人员实际上在PyPI上发布了TensorFlow的轮子,这就是为什么它是推荐的官方方式。
conda
软件包由Anaconda员工和/或社区创建。这并不意味着conda包是坏的,它只是意味着TensorFlow维护人员没有(正式)参与其中。基本上,他们只是说:“如果您在安装
pip
时遇到问题,TensorFlow开发人员会尽力帮助您。但我们并不正式支持
conda
软件包,因此如果conda软件包出现问题,您需要询问conda软件包维护人员。您已经收到警告。”


在更一般的情况下:

对于仅限Python的软件包,应始终使用
conda安装
。可能会有例外,例如,如果根本没有康达软件包,或者康达软件包已经过时(并且没有人发布该软件包的新版本),并且您确实需要该软件包/版本

但是,对于需要编译的包(例如C扩展等),情况有所不同。这是不同的,因为使用
pip
可以安装以下软件包:

  • 作为预编译的轮子
  • 作为软件包,在您的计算机上编译
而康达只是提供

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

对于conda,您必须按原样接受包,这意味着您必须假设包是二进制兼容的。如果它们不是,它将不起作用(segfault或链接错误或其他)

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

然而,它可能应该在个案的基础上作出决定。我的
tensorflow
conda环境没有问题,我在那里安装了
conda forge
频道的所有包,包括tensorflow。然而,我听说有几个人在混合
conda forge
anaconda
频道环境中遇到tensorflow问题。例如,主通道的NumPy和conda forge通道的TensorFlow可能只是二进制不兼容

我的经验是:

  • 如果它是一个纯Python的软件包,只需安装它(这不太可能造成麻烦)。在可能的情况下使用conda软件包,但如果使用pip,则不会造成(太多)麻烦。如果您使用pip安装它,它不是由conda管理的,因此它可能不会被识别为可用依赖项,您必须自己更新它,但这就是所有的区别
  • 如果它是一个编译包(如C扩展或C库的包装器等),那么它会变得有点复杂。如果您想“小心”或有理由期待出现问题:
  • 如果需要测试来自不同通道和/或conda和pip的编译包,请始终创建一个新环境。丢弃一个乱七八糟的conda环境很容易,但修复一个您所依赖的环境要烦人得多
  • 如果可能,请使用
    conda install
    一个且仅一个频道(如果可能,请使用主anaconda频道)安装所有编译的软件包
  • 如果不可能,尝试将主anaconda通道编译包与来自不同通道的conda包混合使用
  • 如果这不起作用,尝试混合使用conda编译包和pip编译包(预编译程序或自编译安装程序)

您询问了为什么不能使用
conda
从PyPI安装软件包。我不知道确切的原因,但pip主要提供该软件包,您必须自己安装。使用conda,您可以得到一个已经编译并安装的软件包,它只是“复制”而没有安装。这就要求软件包安装在不同的操作系统(Mac、Windows、Linux)和平台(32位、64位)上,针对不同的Python版本(2.7、3.5、3.6),可能还针对不同的NumPy版本。这意味着康达必须提供多个软件包,而不仅仅是一个。这会占用资源(最终安装的软件包的空间和安装的时间),而这些资源可能不可用或不可行。除此之外,可能没有将pypi包转换为康达配方的转换器