使用pip安装Python包相比conda的具体优势是什么?

46
我使用 miniconda 作为默认的 Python 安装程序。关于何时使用 conda 或 pip 进行安装,目前(2019 年)有哪些经验之谈?
我的常规做法是使用 pip 安装所有内容,只有在通过 pip 无法获取某个软件包或 pip 版本不正确时才使用 conda。
是否总是优先使用 conda install 有什么优势?混合使用这两种安装程序会带来哪些问题?我应该考虑哪些因素呢?
客观性: 这并不是基于个人喜好的问题!我的问题是当我可以使用 pipconda 安装 Python 包时,如何做出明智的选择?而不是 "告诉我哪个更好",而是 ""为什么我会使用一个而不是另一个,来回切换是否会导致问题/低效?"
6个回答

28

我发现我首先使用Conda是因为它能安装二进制文件,如果包不存在,那么就尝试使用pip。例如,与pip相比,psycopg2在Conda中更容易安装。

https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/

Pip代表Pip Installs Packages,是Python官方认可的软件包管理器,最常用于安装发布在Python Package Index(PyPI)上的软件包。pip和PyPI都受Python Packaging Authority(PyPA)的治理和支持。

简而言之,pip是Python软件包的通用管理器,而conda是一款跨平台、语言不限的环境管理器。对于用户来说,最显著的区别可能是:pip在任何环境中安装Python软件包;而conda在conda环境中安装任何软件包。如果你所做的只是在隔离的环境中安装Python软件包,则conda和pip+virtualenv基本可以互换,除了一些依赖处理和软件包可用性上的差异。通过隔离的环境,我指的是conda-env或virtualenv,在其中你可以安装软件包而不修改系统Python安装。

如果我们专注于Python包的安装,conda和pip面向不同的受众和不同的用途。如果您想在现有系统的Python安装中管理Python包,conda无法帮助您:按设计,它只能在conda环境中安装包。如果您想使用许多依赖于外部依赖项的Python包(例如NumPy、SciPy和Matplotlib),并以有意义的方式跟踪这些依赖关系,pip无法帮助您:按设计,它只管理Python包而不涉及其他依赖项。
Conda和pip不是竞争对手,而是专注于不同用户群体和使用模式的工具。

1
我喜欢这个答案!我可能会从pip先切换到conda先...那个关于二进制的psycopg2消息在Django项目上一直困扰着我 :-) - Scott Skiles
@ScottSkiles 关于二进制的psycopg2消息可以通过链接到正确版本的OpenSSL来解决:https://dev59.com/-F8d5IYBdhLWcg3w61xT#56228387 - Bash
你是说你不能在普通的非conda Python中使用Numpy吗?我想我一直以来都把Anaconda当作理所当然了。 - gargoylebident
这是否仍适用于PyPi上的psycopg2-binary软件包(https://pypi.org/project/psycopg2-binary/)? - kellpossible

22

注意: 下面的建议现在已经成为官方文档的一部分


"关于何时使用 condapip 进行安装,目前(2019年)有哪些最佳实践?"

Anaconda公司的Jonathan Helmus在他的文章 "在Conda环境中使用Pip" 中很好地总结了这个问题。下面是最终最佳实践的摘录:

最佳实践清单

仅在使用了 conda 之后再使用 pip

  • 尽可能使用 conda 安装要求,然后使用 pip
  • pip 应该使用 --upgrade-strategy "only-if-needed"(默认值)运行
  • 不要使用 --user 参数运行 pip,避免所有“用户”安装

使用 Conda 环境进行隔离

  • 创建一个 Conda 环境,以隔离 pip 进行的任何更改
  • 由于硬链接的使用,环境占用很少的空间
  • 应该避免在 [base] 环境中运行 pip

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

  • 一旦使用了pipconda将无法察觉到更改
  • 要安装其他Conda包,最好重新创建环境

condapip的需求存储在文本文件中

  • 可以通过--file参数将软件包需求传递给conda
  • pip可以使用-r--requirements与Python软件包列表配合使用
  • conda env将根据带有condapip需求的文件导出或创建环境

你提供的文章实际上包含了“not”。我认为它不应该在那里,所以我没有看到任何矛盾之处。我的理解是,“使用--user仅为当前用户安装它,而不是为所有用户(系统范围)安装它”,这对我来说很有意义。然而,现在我有点困惑,我应该在conda环境中选择--user安装吗? - orangeInk
@orangeInk 不好意思,我之前联系过作者,他已经修改了代码并加入了“not”,但我还没有来得及删除这里多余且令人困惑的评论。在虚拟环境中使用--user会导致安装在环境特定的site-packages之外,这是不希望看到的。更多细节请参见此答案 - merv
1
我该如何“重新创建”环境?我的使用情况如下。我使用conda来管理不同的环境。然而,某些包在conda中不可用。因此,我使用pip来使用这些包。何时以及如何重新创建环境? - David293836
2
@David293836 创建一个YAML定义 - 这允许指定Conda和PyPI包。一个好的起点是先使用conda env export -n your_env > env.yaml。编辑以包括新的包。删除之前的环境,然后在conda env create -f env.yaml -n your_env中使用YAML。或者更加谨慎地,使用不同的名称创建环境,并在验证其工作正常后仅删除旧环境。 - merv

6
这是我所做的:
  1. 激活您的conda虚拟环境
  2. 使用pip在您的虚拟环境中安装
  3. 如果遇到任何兼容性问题,请使用conda
最近我遇到了这个问题,当numpy/matplotlib出现问题时,我使用conda构建来解决了这个问题。

4

eatmeimadanish的观点一致。在您的*conda起点上,先使用Conda,再使用pip是最明智的选择。

背景简介

Anaconda(发行版)和Conda(包管理器)旨在解决现有状态下的安装和集成问题。

这里的现有状态涵盖了广泛的领域:任何Python二进制组合(系统提供的或从Python.org下载的),系统级软件包安装程序(例如apt get、yum、homebrew),Python专用软件包安装程序(例如easy_install和pip)以及设置框架(例如setuptools和distutils)。这种现状已经随着时间的推移而大大演变,其中一些部分(例如easy_install、distutils)已经消失,新的部分(例如wheels、twine)也已经加入。它没有看到JavaScript生态系统的巨大和持久的变化,但是Python的打包和安装从来没有真正成为“一个解决的问题”,并且解决问题的首选方案随时间而变化。你可以认为原生Python工具曾经存在的某些或大多数问题现在基本上得到了解决。至少有些问题已经得到解决,但是*conda社区非常不同意它们已经被淘汰。

如果您从Anaconda或miniconda开始,我假设您喜欢它们的优点(更容易安装、更好的集成等)。否则,您可能会选择更“原始”或香草味十足的Python发行版,或者可能会选择其他“比基本Python更好,因为X、Y和Z”的发行版(例如ActivePython、Enthought Canopy等)。鉴于这一点,我认为您应该首先使用conda,然后再使用pip,而不是反过来。

当然,您可以尝试使用pip安装每个软件包,并在pip令人失望时回退到conda,但这似乎违背了您最初选择*conda工具和生态系统的主要选择。


3
当使用Anaconda生态系统时,您应始终优先选择conda而不是pip。 文档特别提到了这一点:(重点在我这里)

如果conda或Anaconda.org中没有可用的软件包,则可以尝试使用pip等其他软件包管理器找到并安装该软件包。

Pip软件包没有conda软件包的所有功能,我们建议首先尝试使用conda安装任何软件包。如果该软件包无法通过conda获得,请尝试使用pip进行安装。pip和conda软件包之间的差异导致某些不可避免的兼容性限制,但conda会尽力与pip兼容。

使用conda软件包可以帮助您的环境保持一致,特别是如果您需要在同一环境中管理许多依赖项(或者没有环境但直接使用基本环境)。

2
作为对@eatmeimadanisch和@merve建议“先使用conda,然后尝试pip”的补充,以下是在Linux系统命令行中运行此代码的相应代码:
while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt

这假设所有带有所需包编号的软件包都被放置在名为“requirements.txt”的文件中。例如,条目如下:
matplotlib==2.0.0
numpy==1.18.1

请注意等号是双等号(==),而不是单等号(=)。

2
问题在于,Conda构建的软件包名称不一定与PyPI名称相同。例如,wget是Conda上的二进制文件,而不是PyPI上的Python软件包。 - merv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接