使用conda的Python虚拟环境的权威指南

2,026 阅读20分钟

Darth Vader about conda envs

关于conda envs的达斯-维德

有两种类型的数据科学家,一种是花时间掌握conda的人,另一种是没有掌握的人(并因此在角落里哭泣)。

这是WhiteBox工具包系列的第一篇文章,在这里我们将高度详细地告诉你关于我们在日常工作中使用的工具。

这篇文章是关于conda的**,**我们用它来安装和管理我们系统中的Python及其库。我们在开发和生产中都使用它,而且我们坚信conda比其他替代工具如virtualenv、poetry、pyenv或pipenv更突出。

我们不使用conda是因为习惯问题。我们也尝试过其他的替代品,但总是回到conda,因为它是市场上唯一的,可以说是功能齐全的解决方案。

根据我6年多来做数据科学的经验,conda(和一般的虚拟环境)是一个经常不被人理解的工具。你会惊讶于有多少优秀的专业人士,即使有5年以上的经验,仍然在混乱的、损坏的、几乎无法使用的Python安装中挣扎,因为这一点。

这篇文章的目的是要彻底结束**这种疯狂的状态。**如果你对虚拟环境有了更好的理解,我们的目标就达到了。

Probably, your Python environment (image by xkcd: http://xkcd.com/1987)

大概,你的Python环境(图片来自xkcd:xkcd.com/1987)

1.虚拟环境

首先,让我们通过一些例子深入了解什么是虚拟环境,什么不是

1.1 使用案例

想象一下,你想开始一个新的数据科学项目。你想。

  • 从一个.csv文件加载一些数据。

  • 进行一些转换(清理、聚合等)。

  • 训练一个机器学习模型。

要做到这一点,你要使用Python(或R),以及一些库。就Python而言,你需要。

  • Python本身

  • pandas

  • scikit-learn

在大多数类似UNIX的操作系统(Linux发行版和macOS)中,Python已经与操作系统一起开箱即用了。只要打开一个终端,然后写:which python3

which python3  command

which python3 命令

正如你所看到的,这个命令的输出显示,Python 已经安装在我们的系统中,特别是在/usr/bin/python3 的位置。Python 在我们的系统中只是一个可执行的二进制文件。

这个Python的安装被称为System Python,它意味着这个可执行文件被我们的操作系统用来做很多事情。例如,如果你打开一个文件资源管理器,它可能会在罩子下面使用 System Python 来列出文件和文件夹。这就是我们希望保留这个 Python 安装的干净和完美工作的原因。

如果在安装库(如 pandas 或 scikit-learn)的过程中,System Python 坏了(相信我,狗屎会发生),那么遇到麻烦(复杂的修复/新的操作系统安装)的概率很高,这就是虚拟环境存在的原因之一,而且如此受欢迎。

现在想象一下,你想用Python 3.8版本安装最新版本的Apache Airflow(一个用于协调工作流的Python库),但你的系统运行的是Python 3.7。在这种情况下,虚拟环境也是你最好的朋友。

虚拟环境的典型用途是。

  • 你可以毫无顾忌地进行实验。安装和卸载库,如果有什么东西坏了,你可以直接删除环境,然后重新创建它,没有任何风险。

  • 你可以根据你的需要创建尽可能多的虚拟环境。例如,为每个项目创建一个虚拟环境,或者为每个你想与系统其他部分隔离运行的应用程序创建一个虚拟环境(Jupyter、Apache Airflow等)。

  • 一些库可能有冲突的要求(例如,一个库需要Python 3.6,而另一个未维护的遗留库仍然需要Python 2.7),可以安装在不同的虚拟环境中。

1.2 定义

一个虚拟环境只是一个隔离**的 Python 及其库的安装。**在这篇文章的下一节,我将解释虚拟环境并不局限于 Python,而是任何任意的软件。

virtual environments

虚拟环境

例如,在上面的图中,我们有

  • 一个系统Python(3.7版本)。

  • 一个带有4个虚拟环境的conda安装,2个Python,1个R,1个Java。

我们会更深入地了解这个图的含义,但现在,你应该对什么是虚拟环境有基本的了解。

在使用 conda 来创建和管理我们的虚拟环境的情况下,这些虚拟环境是完全独立的,这意味着它们与系统 Python 或彼此之间没有关系。其他的虚拟环境管理器并不尊重这种独立性,它们与 System Python 建立链接,限制了你对 Python 版本的选择。

2.神话故事

如果你正在阅读这篇文章,并且你可能已经有了一些关于虚拟环境的知识(或者至少,你认为你已经有了),那么让我们开始与一些关于虚拟环境和conda的骗局作斗争,你可能已经熟悉了。

2.1 conda和Anaconda(或Miniconda)是同一回事:假的

conda是一个虚拟环境管理器,一个允许你创建、删除或打包虚拟环境以及安装软件的软件,而Anaconda(和Miniconda)包括conda以及一些预先**下载的库。**在Miniconda的情况下,只是必要的库,只是工作,而在Anaconda的情况下,超过500Mb的库。请看下面的图表。

conda, miniconda and anaconda

Conda、Miniconda和Anaconda

在这一点上,没有经验的用户会想:"好吧,让我们安装Anaconda(而不是Miniconda),否则我将失去对一些库的访问"。嗯......这根本不是**真的。**请到下一节了解更多信息。

2.2 你必须安装Anaconda而不是Miniconda才能访问更多的库。错

Anaconda和Miniconda的唯一区别是,Anaconda已经预先下载了很多库**,所以**当你做conda install pandas ,它已经从网上下载并准备好安装。

与Miniconda相比,这并不是一个巨大的优势。

  • 现在,大多数工作站和服务器都可以使用快速的互联网连接。当你试图安装一个新的库时,conda首先检查它是否已经在你的系统中下载/缓存,如果没有,就从互联网上下载。

  • 此外,库的版本会不断地更新,所以Anaconda的500Mb的缓存库可能在几个小时后就会过时。

  • 在Anaconda预装的所有库中,你可能只需要一小部分来开始你的项目工作。

要明确的是:**Anaconda和Miniconda的可用库目录是一样的,**安装Anaconda比Miniconda没有任何优势(除非你想失去500Mb的硬盘存储空间)。只要安装Miniconda并让conda(记住,是虚拟环境管理器)根据需要从网上下载并安装最新版本的软件包。

2.3 你可以使用conda或pip,但不能同时使用。错

有一种延伸的观点认为conda和pip是替代品或竞争对手,这是不对的。conda和pip的目标不一样,它们在一起工作得相当好!

请记住在这篇文章的开头,conda是一个虚拟环境管理器,一个能做两件事的软件。

  1. 管理虚拟环境:它创建、删除或打包虚拟环境。

  2. 从conda资源库中安装库(也叫通道):它允许在虚拟环境中安装软件。这些软件包括整个编程语言如Python、R或Java,库如pandas或scikit-learn,甚至软件如htp、tmux或一个成熟的PostgreSQL数据库。

conda和pip的唯一竞争点是第2点的一个子集:安装Python库。当你创建一个新的虚拟环境时,你可以使用conda或pip安装Python库。大多数时候,用conda或pip安装它们并没有什么区别。pip目录更加完整,而conda的依赖关系解析器则更加强大。在一个 conda 虚拟环境中,你可以同时使用 conda 和pip 来安装库。

2.4 conda 只适用于 Python 虚拟环境。False

这是conda虚拟环境_的_一个鲜为人知的_特点_,使它在竞争中脱颖而出。

大多数人认为conda是针对Python的,但实际上conda虚拟环境是一个通用环境,你几乎可以安装任何东西。需要R和RStudio吗?你得到了它。需要Java吗?你可以的。你甚至可以安装一些传统上使用aptbrew 安装的库,比如 htop 或 tmux。

2.5 venv就像conda一样,但是很轻便。错

venv 和 conda 主要有两点不同。

  • conda不仅仅是一个Python虚拟环境管理器。它是一个通用的虚拟环境,支持的内容远不止Python。安装在conda环境中的Python是一个真正的Python可执行文件,而不是与你的系统Python的链接(就像其他替代方案那样),所以它的版本可以是你想要的任何版本,不受系统Python的限制。

  • venv仅限于使用pip安装软件包,而使用conda,你可以同时使用pip和conda软件包安装程序。

3.conda的安装

3.1 Linux和MacOS

如果你使用的是Linux或MacOS,程序是非常相似的。仔细遵循这些步骤(不要跳过任何东西)以避免安装后的问题。

Miniconda Linux and MacOS installers

Miniconda Linux和MacOS安装程序

  1. 转到:https://docs.conda.io/en/latest/miniconda.html

  2. 下载Linux或MacOS的最新版本。我的建议是使用bash安装程序(.sh 文件)。在MacOS的情况下,你也可以选择图形安装程序(.pkg)。要下载,只需点击链接,如果你不能访问图形界面,只需使用wget 。下载最新的版本。如果你需要Python 3.7,不要担心有Python 3.9。这只是(base) 环境的 Python 版本,是 conda 内部使用的版本,但不是你的虚拟环境的 Python 版本(你可以选择你想要的版本)。

  3. 从终端执行bash安装程序(它只是一个bash脚本):bash Miniconda3-py39_4.9.2-Linux-x86_64.sh

  4. 点击Enter 来阅读安装的 T&C 部分,直到安装程序要求你回答yes/no 。回答yes

  5. 现在,安装程序正在询问安装位置。我的建议是:保持默认位置:/home/<your_user>/miniconda3

  6. 现在安装程序会问你是否要初始化conda。回答 "是"(要小心,因为默认答案被设置为 "否")。初始化conda后,你每次打开conda时都可以从标准终端访问它。如果你不初始化conda,当你打开终端时,你可能无法访问conda (conda的可执行文件将不在你的PATH上)。

  7. 关闭终端。

最后,你可以通过这种方式检查conda是否正确安装。

  1. 打开一个新的终端。

  2. 你应该在你的提示符中看到一个(base) 。这意味着conda已经正确地安装和初始化了,并且激活了一个叫做base的默认环境。

  3. 在你的终端写下conda 。你应该看到conda的帮助。

  4. 在你的终端上写下conda info 。你应该看到关于你当前conda安装的细节。

conda prompt modifier

conda提示修改器

conda help  command

conda help 命令

conda info  command

conda info 命令

3.2 Windows

Miniconda Windows installers

Miniconda Windows安装程序

如果你使用的是Windows,安装程序只是一个标准的图形化安装程序。

⚠️警告。Windows不是标准 ⚠️

我必须警告你,Windows不是开发数据科学项目(以及大多数软件开发任务)的标准,所以你可以期待很多东西不能像在Linux上那样顺利地工作。你被警告了!如果你对为数据科学项目建立一个专业的开发环境感兴趣,请查看这个帖子

  1. 转到:https://docs.conda.io/en/latest/miniconda.html

  2. 下载Windows下的最新版本。确保你下载的是最新的Python版本。如果你需要Python 3.7或3.8,不要担心有Python 3.9。这只是base 环境的 Python 版本,是 conda 内部使用的版本,但不是你的虚拟环境的 Python 版本(你可以选择你想要的版本)。

  3. 执行安装程序 (.exe)。

  4. 点击Next > 直到要求你选择安装的范围。选择Just Me 选项。在大多数情况下,你不需要为所有用户安装conda(这需要管理员权限),而只是为你安装。

  5. 现在,安装程序正在询问安装位置。我的建议是:保持默认位置:C:\Users\<your_user>\miniconda3

  6. 现在,安装程序将要求你设置高级选项。不要把conda添加到Windows的PATH环境变量中,因为事情的运作方式与其他操作系统不同,你将使用一个特殊的终端来访问conda。

conda install scope (W10)

conda安装范围(W10)

conda install location (W10)

conda安装位置(W10)

conda install advanced options (W10)

conda安装高级选项(W10)

最后,你可以通过这种方式检查conda是否正确安装。

Anaconda Prompt (W10)

Anaconda提示 (W10)

  1. 打开Windows的开始菜单,寻找一个名为Anaconda Prompt的应用程序。打开它。

  2. 在Anaconda Prompt终端中写下conda 。你应该看到conda的帮助。

  3. 在你的终端中写下conda info 。你应该看到关于你当前conda安装的细节。

4.虚拟环境管理

在本节中,我将教你管理虚拟环境的最佳做法

警告:避免使用Anaconda Navigator ☠️

Anaconda Navigator

Anaconda Navigator

有一个非常流行的(尤其是在Windows中)工具,它只是conda CLI工具的一个前置。这个图形化的工具并不是很好用,除非它在最近有了很大的改进,否则我不鼓励你使用它,因为它要对许多破碎的环境负责。 坚持使用CLI来管理你的conda环境。

4.1 基本环境

在conda安装过程中,一个叫做base的默认虚拟环境被创建。这个环境被conda内部使用来工作。conda本身就像一个库一样安装在这个环境中😊。尽管你可以使用这个环境来安装库,但我建议你不要这样做。不要乱用基础环境。

4.2 创建一个新的虚拟环境

要创建一个虚拟环境,只要做。

conda create -n <environment_name>

并确认你想用y (是)来创建环境。

这将创建一个虚拟环境。空是加粗和下划线的,因为我是认真的。它是空的。这个环境中没有安装任何东西,是的,这意味着 Python 也没有安装在这个环境中。

⚠️ 警告:不要在空环境中运行**pip install**命令 ⚠️

当你创建一个空的虚拟环境时,由于该环境上没有安装Python,也没有安装pip,当你运行pip install 命令时,你可能是在系统Python(可怕的😱)或基础环境中安装该库(没那么可怕,但也不好)。

ℹ️信息:虚拟环境实际生活在文件夹里 ℹ️

由用户创建的conda虚拟环境(基础环境除外)物理上位于路径中的文件夹中(对于Linux/MacOS)。

/home/<your_user>/miniconda3/envs/<environment_name>

现在你已经创建了你的第一个虚拟环境,让我们进入下一步...激活它。

4.3 激活和停用一个虚拟环境

要激活一个虚拟环境,请使用activate 命令。

conda activate <environment_name>

激活一个环境意味着从激活时刻开始,你所执行的所有环境操作都将在活动环境上进行。

你可以通过两种方式检查活动环境。

  • 检查修改后的提示,因为活动环境的名称会出现在括号内。

conda activate  command

conda activate 命令

  • 检查命令的输出:conda env list

conda env list  command

conda env list 命令

要停用一个虚拟环境,使用deactivate 命令。

conda deactivate

修改后的提示符将显示之前活动环境的名称(通常是基础环境)。

☠️警告:避免堆叠环境 ☠️

你必须非常小心地激活环境,而且一旦你不打算使用一个环境,必须始终记得停用它,因为环境可以被堆叠。这意味着你可以在另一个环境的上面激活一个环境。这种行为(在非常特殊的情况下很有用)会在很短的时间内导致混乱:安装在环境中的库会混在一起,你不知道它们安装在哪里。

现在你知道了如何激活和停用环境,让我们进入下一步...在一个空环境中安装 Python。

4.4 在虚拟环境中安装 Python

记住,当你创建虚拟环境时,它们是空的。如果你需要一个 Python 虚拟环境,你的第一个任务就是在这个空的虚拟环境中安装 Python。

要在一个空的虚拟环境中安装 Python,运行命令 (别忘了先激活环境)。

conda install python

这个命令将安装 conda 仓库中最新的 Python 版本 (在写这篇文章的时候,最新版本是 3.9)。如果你需要一个较早的Python版本,你可以在命令中直接指定它。

conda install python=3.8

☠️ Warning: latest Python version ☠️

安装最新版本的Python时要小心。大多数库需要几个月的时间来适应新的Python版本,并且在最新的版本中不能正常工作。我通常坚持在我的所有项目中使用稍老的(落后1-2个版本)版本。

现在你已经有了一个安装了Python的工作虚拟环境,让我们进入下一步...安装额外的库。

4.5 在虚拟环境中安装 R

如果你在你的虚拟环境中需要R,请运行下面的命令,而不是前面的命令。

conda install r-essentials

这个命令将安装R和一些_基本的R_包。

4.6 安装库

4.6.1 从conda或pip安装

要在conda虚拟环境中安装一个库,你通常会运行这个命令。

conda install <library_name>

如果你需要一个库的特定版本,只需指定它。

conda install tensorflow=2.4.1

记住,使用本地的 conda 安装命令,你不仅可以安装 Python 库,还可以安装很多其他的软件。

  • 一个进程查看器。conda install htop

  • 一个终端复用器:conda install tmux

  • Postgres:conda install -c conda-forge postgresql

  • 还有很多其他的软件...

只针对Python库,如果你在虚拟环境中安装了Python,你可以使用pip来安装库,比如说。

pip install <library_name>

如果你需要一个特定的版本,可以像这样指定它。

pip install tensorflow==2.4.1

4.6.2 conda渠道

来自conda的软件仓库被称为_通道。_一个通道就像一个文件夹,它包含多个库。最重要的通道是。

  • anaconda (default): 默认的conda通道,称为anaconda,是比较稳定的通道,也是最值得信任的软件所在的地方。如果你不指定一个频道,conda将在这个频道中寻找库。

  • conda-forge:社区驱动的频道,有最新版本的库。如果你需要一个不在默认频道中的库,你可能可以在这里找到它。

每个人都可以拥有自己的conda频道。许多公司都有自己的conda频道,他们在这里上传软件。例如,英特尔有它的 conda 频道,其中的库已经过优化,可以在英特尔硬件中运行:https://anaconda.org/intel/repo

当你在一个空的环境中安装Python时,你是在不知不觉中从默认的anaconda频道下载和安装Python。

如果你需要从一个特定的通道安装一个库,使用参数-c ,后面跟上通道的名字,像这样。

conda install -c <channel_name> <library_name>

例如,要从 Plotly 官方频道安装图形库 Plotly。

conda install -c plotly plotly

要在一个conda频道中搜索一个库,你可以使用search 命令。

conda search -c <channel_name> <library_name>

这个命令会返回该库的所有可用版本及其相应的构建。

conda search  command

conda search 命令

现在,让我们来看看一些你可能想在conda虚拟环境中安装的、有点棘手的常用库和包......

4.6.3 安装Jupyter

JupyterLab

JupyterLab

要在虚拟环境中安装最新的Jupyter版本。

conda install -c conda-forge jupyterhub jupyterlab nodejs nb_conda_kernels

这个安装包括新的前端(JupyterLab)以及其他工具,允许认证(JupyterHub),安装扩展(Node.js),以及自动发现内核的库(nb_conda_kernels)。

4.6.4 安装Spark

要在虚拟环境中安装Spark。

conda install -c conda-forge openjdk pyspark

这个安装包括Spark(含PySpark)以及Java虚拟机(Spark运行需要)。

4.6.5 安装支持GPU的Tensorflow

conda install -c conda-forge tensorflow-gpu

如果你已经正确地安装了NVIDIA驱动,那么这个安装就可以工作。它将为你设置其余的NVIDIA东西(CUDA,cuDNN等)。

4.7 列出已安装的库

要获得conda虚拟环境中所安装的软件的完整列表,请使用list 命令(记得事先激活所需的虚拟环境)。

conda list

conda list  command

conda list 命令

4.8 删除一个虚拟环境

虚拟环境最好的一点是,当你不再需要它们的时候,或者有什么东西出错了,坏了,你可以随时删除它,然后从零开始重新创建它。

要删除一个conda虚拟环境,请使用remove 命令。

conda env remove -n <environment_name>

在它的正常运行中,conda对环境中使用的库进行了缓存,这样它就不必在另一个环境中需要某些库时下载它。它允许conda节省一些磁盘。

在删除一个环境之后,一些库仍然被缓存着,但不再需要了。你可以通过clean 命令清理你的conda缓存,并释放你全新的SSD中一些宝贵的GB。

conda clean --all

5.虚拟环境的共享和打包

本节详细介绍了两种共享和分发conda环境的方法,每一种都有其优点和缺点。

5.1 以YAML文件形式共享conda环境

分享环境的一个有趣的选择是将其编码为一个.yml 文件。要从一个现有的环境中创建一个YAML文件,请运行export 命令。

conda env export >> environment_file.yml

conda environment YAML file

conda环境YAML文件

你也可以手动创建一个YAML文件,像这样。

name: <environment_name>
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.8
  - pip
  - pandas
  - matplotlib
  - scikit-learn
  - pip:
    - lightgbm

注意,你可以同时指定来自conda通道或pip的软件包。

要从YAML文件中创建一个conda环境,运行create 命令,其语法如下。

conda env create -f environment.yml

5.2 用以下方法打包一个conda环境conda-pack

conda的一个极好的功能是conda-pack,这在竞争对手中是没有的。在WhiteBox,我们利用这个功能将我们的项目部署在极其恶劣的环境中,比如大公司的Hadoop集群,有极端的安全措施,并且与互联网隔离。

conda-pack 是一个库,它允许你将整个环境打包成一个压缩文件(tar.gz),你只需复制和粘贴到某个地方,它就可以正常工作。

  1. 安装conda-pack: conda的创造者建议在基本环境中安装这个库,在那里你可以运行conda install -c conda-forge conda-pack

  2. 激活所需的环境:conda activate environment_name

  3. 把你自己放在你想生成压缩文件的路径中:cd path/to/desired/directory

  4. 打包你的环境:conda pack 。这可能需要一些时间,取决于环境的大小和安装的库的数量。

  5. 将压缩文件移到目的地(例如,通过ssh)。

  6. 为环境创建一个文件夹:mkdir environment_folder

  7. 在文件夹中解压环境:tar xzvf <environment_name>.tar.gz -C environment_folder

  8. 激活环境:source environment_folder/bin/activate

  9. 运行conda-unpack 来重新创建符号链接并设置好一切。

  10. 你就完成了!

6.关于虚拟环境的最后的话

我希望在这篇文章的帮助下,你对虚拟环境有了更深刻的理解,并且不再被卡在破碎的库之间。

如果你错过了什么,或者发现某些部分令人困惑,请让我们知道,以便我们可以改进这个帖子。

如果你对我们已经在很多项目中使用了多年的完整的数据科学家设置感兴趣的话,这篇文章中描述的设置是经过战斗考验的。