当pip和conda重叠时该怎么办?

Aar*_*ock 9 python numpy pip conda

我对conda install&之间的区别有一个合理的理解pip install; 如何pip只安装python包并conda可以安装非python二进制文件.但是,这两者之间存在一些重叠.这让我想问:

对于是否使用condapip两者都提供包装有什么经验法则?

例如,TensorFlow两个存储库都可以使用,但是来自tensorflow文档:

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

但是,有许多重叠的其他包一样numpy,scipy等等.


但是,此Stackoverflow答案表明conda install应该是默认值,并且pip只应在包不可用时使用conda.即使对于TensorFlow其他仅限python的包,这是真的吗?

MSe*_*ert 11

Tensorflow维护者实际上在PyPI上发布了TensorFlow的轮子,这就是为什么它是推荐的官方方式.这些conda包由Anaconda员工和/或社区创建.这并不意味着conda包是坏的,它只是意味着TensorFlow维护者不参与(官方).基本上他们只是说:"如果你在使用pipTensorFlow 安装它时遇到困难,开发人员会尽力帮助你.但是我们没有正式支持这些conda包,所以如果conda包出现问题你需要问conda-package维护者你被警告了."


在更一般的情况下:

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

然而,对于需要编译的包(例如C-Extensions等)而言则不同.这是不同的,因为pip你可以安装一个包:

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

虽然康达只提供了

  • 编译conda包

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

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

如果您使用pip并可以选择安装哪个轮(如果有),或者根据计算机上的可用库进行编译.这意味着你不太可能获得二进制不兼容性.如果你从不同的conda频道安装conda包,那就是(或者是)一个大问题.因为它们可能只是二元不兼容(例如conda-forge和anaconda-channel有或有一些问题).

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

我的经验法则是:

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

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

  • @ AaronN.Brock是的,没有人真正满意,但是与你没有conda和没有轮子的时候相比,你已经要安装(甚至可能正确链接)包装了.当你使用conda和pip时,它很少会导致问题,它只是不容易管理,因为conda不"知道"pip安装的软件包. (2认同)