我的常规做法是使用 pip 安装所有内容,只有在通过 pip 无法获取某个软件包或 pip 版本不正确时才使用 conda。
是否总是优先使用
conda install
有什么优势?混合使用这两种安装程序会带来哪些问题?我应该考虑哪些因素呢?
客观性: 这并不是基于个人喜好的问题!我的问题是当我可以使用
pip
或 conda
安装 Python 包时,如何做出明智的选择?而不是 "告诉我哪个更好",而是 ""为什么我会使用一个而不是另一个,来回切换是否会导致问题/低效?"conda install
有什么优势?混合使用这两种安装程序会带来哪些问题?我应该考虑哪些因素呢?
pip
或 conda
安装 Python 包时,如何做出明智的选择?而不是 "告诉我哪个更好",而是 ""为什么我会使用一个而不是另一个,来回切换是否会导致问题/低效?"我发现我首先使用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
进行安装,目前(2019年)有哪些最佳实践?"
Anaconda公司的Jonathan Helmus在他的文章 "在Conda环境中使用Pip" 中很好地总结了这个问题。下面是最终最佳实践的摘录:
最佳实践清单
仅在使用了
conda
之后再使用pip
- 尽可能使用
conda
安装要求,然后使用pip
pip
应该使用--upgrade-strategy "only-if-needed"
(默认值)运行- 不要使用
--user
参数运行pip
,避免所有“用户”安装使用 Conda 环境进行隔离
- 创建一个 Conda 环境,以隔离
pip
进行的任何更改- 由于硬链接的使用,环境占用很少的空间
- 应该避免在根 [base] 环境中运行
pip
如果需要更改,重新创建环境
- 一旦使用了
pip
,conda
将无法察觉到更改- 要安装其他Conda包,最好重新创建环境
将
conda
和pip
的需求存储在文本文件中
- 可以通过
--file
参数将软件包需求传递给conda
pip
可以使用-r
或--requirements
与Python软件包列表配合使用conda env
将根据带有conda
和pip
需求的文件导出或创建环境
--user
仅为当前用户安装它,而不是为所有用户(系统范围)安装它”,这对我来说很有意义。然而,现在我有点困惑,我应该在conda环境中选择--user
安装吗? - orangeInk--user
会导致安装在环境特定的site-packages
之外,这是不希望看到的。更多细节请参见此答案。 - mervconda env export -n your_env > env.yaml
。编辑以包括新的包。删除之前的环境,然后在conda env create -f env.yaml -n your_env
中使用YAML。或者更加谨慎地,使用不同的名称创建环境,并在验证其工作正常后仅删除旧环境。 - merv同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工具和生态系统的主要选择。
使用conda软件包可以帮助您的环境保持一致,特别是如果您需要在同一环境中管理许多依赖项(或者没有环境但直接使用基本环境)。如果conda或Anaconda.org中没有可用的软件包,则可以尝试使用pip等其他软件包管理器找到并安装该软件包。
Pip软件包没有conda软件包的所有功能,我们建议首先尝试使用conda安装任何软件包。如果该软件包无法通过conda获得,请尝试使用pip进行安装。pip和conda软件包之间的差异导致某些不可避免的兼容性限制,但conda会尽力与pip兼容。
while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt
matplotlib==2.0.0
numpy==1.18.1
wget
是Conda上的二进制文件,而不是PyPI上的Python软件包。 - merv
psycopg2-binary
软件包(https://pypi.org/project/psycopg2-binary/)? - kellpossible