管理环境#

使用 conda,您可以创建、导出、列出、删除和更新环境,这些环境在其中安装了不同版本的 Python 和/或包。在环境之间切换或移动称为激活环境。您还可以共享环境文件。

此页面上描述的命令提供了许多选项。有关所有可用命令的详细参考,请参阅 命令

使用命令创建环境#

使用终端执行以下步骤

  1. 创建环境

    conda create --name <my-env>
    

    <my-env> 替换为您环境的名称。

  2. 当 conda 要求您继续时,输入 y

    proceed ([y]/n)?
    

    这将在 /envs/ 中创建 myenv 环境。此环境中不会安装任何包。

  3. 创建具有特定 Python 版本的环境

    conda create -n myenv python=3.9
    
  4. 创建具有特定包的环境

    conda create -n myenv scipy
    

    conda create -n myenv python
    conda install -n myenv scipy
    
  5. 创建具有特定包版本的环境

    conda create -n myenv scipy=0.17.3
    

    conda create -n myenv python
    conda install -n myenv scipy=0.17.3
    
  6. 创建具有特定 Python 版本和多个包的环境

    conda create -n myenv python=3.9 scipy=0.17.3 astroid babel
    

    提示

    同时安装您想要在此环境中安装的所有程序。一次安装一个程序会导致依赖关系冲突。

要每次创建新环境时自动安装 pip 或其他程序,请将默认程序添加到 create_default_packages 部分您的 .condarc 配置文件。每次创建新环境时都会安装默认包。如果您不希望在特定环境中安装默认包,请使用 --no-default-packages 标志

conda create --no-default-packages -n myenv python

提示

您可以在 conda create 命令中添加更多内容。有关详细信息,请运行 conda create --help

从 environment.yml 文件创建环境#

使用终端执行以下步骤

  1. environment.yml 文件创建环境

    conda env create -f environment.yml
    

    yml 文件的第一行设置新环境的名称。有关详细信息,请参阅 手动创建环境文件

  2. 激活新环境:conda activate myenv

  3. 验证新环境是否已正确安装

    conda env list
    

    您也可以使用 conda info --envs

为环境指定位置#

您可以在创建环境时提供目标目录的路径来控制 conda 环境的位置。例如,以下命令将在当前工作目录的子目录中创建一个新环境,名为 envs

conda create --prefix ./envs jupyterlab=3.2 matplotlib=3.5 numpy=1.21

然后,使用与激活按名称创建的环境相同的命令来激活使用前缀创建的环境

conda activate ./envs

在创建环境时为项目目录的子目录指定路径具有以下优点

  • 通过将环境作为子目录包含在内,可以轻松判断您的项目是否使用隔离环境。

  • 它使您的项目更加独立,因为所有内容(包括所需软件)都包含在单个项目目录中。

在子目录中创建项目环境的另一个好处是,您随后可以使用相同的名字来命名所有环境。如果您将所有环境都保存在 envs 文件夹中,则必须为每个环境指定不同的名称。

在将 conda 环境放置在默认的 envs 文件夹之外时,有一些事项需要注意。

  1. Conda 无法再使用 --name 标志找到您的环境。通常,您需要传递 --prefix 标志以及环境的完整路径才能找到环境。

  2. 在创建 conda 环境时指定安装路径会导致命令提示符现在以活动环境的绝对路径为前缀,而不是以环境的名称为前缀。

使用前缀激活环境后,您的提示符将类似于以下内容

(/absolute/path/to/envs) $

这会导致很长的前缀

(/Users/USER_NAME/research/data-science/PROJECT_NAME/envs) $

要移除shell提示符中的长前缀,请修改.condarc文件中的env_prompt设置。

conda config --set env_prompt '({name})'

这将编辑您的.condarc文件(如果您已经拥有一个)或创建一个.condarc文件(如果您没有)。

现在,您的命令提示符将显示活动环境的通用名称,即环境根文件夹的名称。

$ cd project-directory
$ conda activate ./env
(env) project-directory $

更新环境#

您可能需要出于各种原因更新您的环境。例如,可能是以下情况之一:

  • 您的一个核心依赖项刚刚发布了新版本(依赖项版本号更新)。

  • 您需要一个额外的包进行数据分析(添加新的依赖项)。

  • 您找到了一个更好的包,不再需要旧的包(添加新的依赖项并移除旧的依赖项)。

如果出现以上任何情况,您只需相应地更新environment.yml文件的内容,然后运行以下命令

conda env update --file environment.yml --prune

注意

--prune选项会导致conda从环境中删除不再需要的任何依赖项。

克隆环境#

使用终端执行以下步骤

您可以通过创建克隆来精确复制环境。

conda create --name myclone --clone myenv

注意

myclone替换为新环境的名称。将myenv替换为要复制的现有环境的名称。

要验证副本是否已创建

conda info --envs

在显示的环境列表中,您应该同时看到源环境和新副本。

构建相同的conda环境#

您可以使用显式规范文件在同一个操作系统平台上构建相同的conda环境,无论是在同一台机器上还是在不同的机器上。

使用终端执行以下步骤

  1. 运行conda list --explicit以生成类似于以下内容的规范列表

    # This file may be used to create an environment using:
    # $ conda create --name <env> --file <this file>
    # platform: osx-64
    @EXPLICIT
    https://repo.anaconda.com/pkgs/free/osx-64/mkl-11.3.3-0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/numpy-1.11.1-py35_0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/openssl-1.0.2h-1.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/pip-8.1.2-py35_0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/python-3.5.2-0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/readline-6.2-2.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/setuptools-25.1.6-py35_0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/sqlite-3.13.0-0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/tk-8.5.18-0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/wheel-0.29.0-py35_0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/xz-5.2.2-0.tar.bz2
    https://repo.anaconda.com/pkgs/free/osx-64/zlib-1.2.8-3.tar.bz2
    
  2. 要将此规范列表作为文件创建到当前工作目录,请运行

    conda list --explicit > spec-file.txt
    

    注意

    您可以使用spec-file.txt作为文件名,或将其替换为您选择的其他文件名。

    显式规范文件通常不是跨平台的,因此顶部会有一个注释,例如# platform: osx-64,显示它创建的平台。此平台是已知该规范文件在其中有效的平台。在其他平台上,指定的包可能不可用,或者对于规范中已有的某些关键包,依赖项可能缺失。

    要使用规范文件在同一台机器或另一台机器上创建相同的环境

    conda create --name myenv --file spec-file.txt
    

    要使用规范文件将列出的包安装到现有环境中

    conda install --name myenv --file spec-file.txt
    

    Conda在从规范文件安装时不会检查架构或依赖项。为确保包正常工作,请确保文件是从工作环境创建的,并在相同的架构、操作系统和平台(例如linux-64或osx-64)上使用它。

激活环境#

激活环境对于使环境中的软件正常工作至关重要。激活涉及两个主要功能:为环境添加PATH条目并运行环境可能包含的任何激活脚本。这些激活脚本是包如何设置其操作可能需要的任意环境变量。您也可以使用配置API设置环境变量.

激活会将PATH前置。这仅在您激活环境时生效,因此它对于终端会话是本地的,而不是全局的。

注意

安装Anaconda时,您可以选择“将Anaconda添加到我的PATH环境变量”。我们不建议这样做,因为它会追加Anaconda到PATH。当安装程序追加到PATH时,它不会调用激活脚本。

注意

在Windows上,PATH由两部分组成,系统PATH和用户PATH。系统PATH始终排在首位。当您为“仅我”安装Anaconda时,我们将它添加到用户PATH。当您为“所有用户”安装时,我们将它添加到系统PATH。在前一种情况下,您最终可能会导致系统PATH值优先于您的条目。在后一种情况下,则不会。我们不建议多用户安装.

要激活环境:conda activate myenv

注意

myenv替换为环境名称或目录路径。

Conda将路径名myenv前置到您的系统命令。

如果您尚未激活环境,您可能会收到警告消息

Warning:
This Python interpreter is in a conda environment, but the environment has
not been activated. Libraries may fail to load. To activate this environment
please see https://conda.io/activation.

如果您收到此警告,则需要激活您的环境。要在Windows上执行此操作,请在终端窗口中运行:c:\Anaconda3\Scripts\activate base

Windows对正确激活非常敏感。这是因为Windows库加载程序不支持了解在何处搜索其依赖项(RPATH)的库和可执行文件的概念。相反,Windows依赖于动态链接库搜索顺序.

如果环境未激活,则找不到库,并且会出现大量错误。当子环境中的Python找不到必要的OpenSSL库时,HTTP或SSL错误是常见的错误。

Conda本身包含一些特殊的解决方法来添加必要的PATH条目。这使得它可以在没有激活的情况下或在任何子环境激活的情况下被调用。一般来说,在不先激活环境的情况下调用环境中的任何可执行文件可能无法正常工作。为了能够在已激活的环境中运行可执行文件,您可能对conda run命令感兴趣。

如果您遇到PATH错误,请查看我们的故障排除.

Conda init#

早期版本的conda引入了脚本,以使激活行为在所有操作系统上保持一致。Conda 4.4允许使用conda activate myenv。Conda 4.6添加了广泛的初始化支持,以便conda在各种shell(bash、zsh、csh、fish、xonsh等等)上运行得更快、更少干扰。现在,这些shell可以使用conda activate命令。无需修改PATH,使conda对系统上的其他软件的干扰更小。有关更多信息,请阅读conda init --help的输出。

在使用conda init时,以下设置可能对您有用

auto_activate_base: bool

此设置控制conda在首次启动时是否激活您的基本环境。无论哪种方式,您都可以使用conda命令,但在不激活环境的情况下,环境中的其他程序都将不可用,直到使用conda activate base激活环境。有些人选择此设置是为了加快shell启动时间,或防止conda安装的软件自动隐藏其其他软件。

嵌套激活#

默认情况下,conda activate将在激活新环境之前停用当前环境,并在停用新环境时重新激活它。有时,您可能希望将当前环境的PATH条目保留在适当的位置,以便您可以继续轻松地访问第一个环境中的命令行程序。这在基本环境中安装了常见命令行实用程序时最常遇到。要保留PATH中的当前环境,您可以使用以下命令激活新环境

conda activate --stack myenv

如果您希望始终从最外层环境(通常是基本环境)进行堆叠,则可以设置auto_stack配置选项

conda config --set auto_stack 1

您可以指定一个更大的数字以获得更深的自动堆叠级别,但我们不建议这样做,因为更深的堆叠级别更有可能导致混乱。

用于DLL加载验证的环境变量#

如果您不想激活环境,并且希望Python用于DLL加载验证,请遵循故障排除说明.

警告

如果您选择不激活环境,则不会发生加载和设置环境变量以激活脚本。我们只支持激活。

停用环境#

要停用环境,请键入:conda deactivate

Conda从您的系统命令中删除当前活动环境的路径名。

注意

要简单地返回到基本环境,最好调用没有指定环境的conda activate,而不是尝试停用。如果您从基本环境运行conda deactivate,您可能会完全失去运行conda的能力。别担心,这对于这个shell是本地的——您可以启动一个新的。但是,如果环境是使用--stack激活的(或自动堆叠的),那么最好使用conda deactivate

确定您的当前环境#

请使用终端执行以下步骤。

默认情况下,活动环境(即您当前使用的环境)将在您的命令提示符开头以括号 () 或方括号 [] 显示。

(myenv) $

如果您没有看到它,请运行

conda info --envs

在显示的环境列表中,您当前的环境将用星号 (*) 突出显示。

默认情况下,命令提示符设置为显示活动环境的名称。要禁用此选项,请

conda config --set changeps1 false

要重新启用此选项,请

conda config --set changeps1 true

查看您的环境列表#

要查看所有环境的列表,请在您的终端窗口中运行

conda info --envs

conda env list

将显示类似于以下内容的列表

conda environments:
myenv                 /home/username/miniconda/envs/myenv
snowflakes            /home/username/miniconda/envs/snowflakes
bunnies               /home/username/miniconda/envs/bunnies

如果此命令由管理员运行,将显示属于所有用户的环境列表。

查看环境中的软件包列表#

要查看特定环境中安装的所有软件包的列表,请

  • 如果环境未激活,请在您的终端窗口中运行

    conda list -n myenv
    
  • 如果环境已激活,请在您的终端窗口中运行

    conda list
    
  • 要查看特定软件包是否安装在环境中,请在您的终端窗口中运行

    conda list -n myenv scipy
    

在环境中使用 pip#

要在您的环境中使用 pip,请在您的终端窗口中运行

conda install -n myenv pip
conda activate myenv
pip <pip_subcommand>

在使用 pip 和 conda 时可能会出现问题。在组合使用 conda 和 pip 时,最好使用隔离的 conda 环境。仅当 conda 已用于安装尽可能多的软件包后,才应使用 pip 安装任何剩余的软件。如果需要修改环境,最好创建新的环境,而不是在 pip 之后运行 conda。在适当的情况下,应将 conda 和 pip 要求存储在文本文件中。

我们建议您

仅在 conda 之后使用 pip
  • 使用 conda 安装尽可能多的需求,然后使用 pip。

  • pip 应使用 --upgrade-strategy only-if-needed(默认值)运行。

  • 不要使用 pip 的 --user 参数,避免所有用户的安装。

使用 conda 环境进行隔离
  • 创建一个 conda 环境来隔离 pip 做出的任何更改。

  • 由于硬链接,环境占用空间很少。

  • 应注意避免在根环境中运行 pip。

如果需要更改,请重新创建环境
  • 一旦使用了 pip,conda 将无法识别这些更改。

  • 要安装其他 conda 软件包,最好重新创建环境。

将 conda 和 pip 要求存储在文本文件中
  • 可以使用 --file 参数将软件包要求传递给 conda。

  • pip 接受使用 -r--requirements 的 Python 软件包列表。

  • Conda env 将根据包含 conda 和 pip 要求的文件导出或创建环境。

设置环境变量#

如果要将环境变量与环境关联,可以使用 config API。建议将其用作使用 activate 和 deactivate 脚本的替代方法,因为这些脚本是可能不安全的任意代码的执行。

首先,创建您的环境并激活它

conda create -n test-env
conda activate test-env

要列出您可能拥有的任何变量,请运行 conda env config vars list

要设置环境变量,请运行 conda env config vars set my_var=value

设置环境变量后,您必须重新激活您的环境:conda activate test-env

要检查环境变量是否已设置,请运行 echo $my_var (echo %my_var% 在 Windows 上) 或 conda env config vars list

停用环境时,可以使用相同的命令查看环境变量是否消失。

可以使用 -n-p 标志指定要影响的环境。使用 -n 标志可以命名环境,使用 -p 标志可以指定环境的路径。

要取消设置环境变量,请运行 conda env config vars unset my_var -n test-env

停用环境时,可以通过重新运行 echo my_varconda env config vars list 查看环境变量是否消失,以显示变量名不再存在。

使用 conda env config vars 设置的环境变量将保留在 conda env export 的输出中。此外,您可以在 environment.yml 文件中声明环境变量,如下所示

name: env-name
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.7
  - codecov
variables:
  VAR1: valueA
  VAR2: valueB

保存环境变量#

Conda 环境可以包含已保存的环境变量。

假设您希望环境“analytics”存储用于登录服务器的密钥和配置文件的路径。以下部分说明了如何在 WindowsmacOS 或 Linux 上编写名为 env_vars 的脚本以执行此操作。

这种类型的脚本文件可以是 conda 包的一部分,在这种情况下,这些环境变量在包含该包的环境被激活时会变为活动状态。

您可以随意命名这些脚本。但是,多个包可能会创建脚本文件,因此请确保使用描述性名称,这些名称不会被其他包使用。一个流行的选择是将脚本命名为 packagename-scriptname.sh 形式,或者在 Windows 上,命名为 packagename-scriptname.bat

Windows#

  1. 通过在命令 shell 中运行 %CONDA_PREFIX%,在您的终端窗口中找到 conda 环境的目录。

  2. 进入该目录并创建这些子目录和文件

    cd %CONDA_PREFIX%
    mkdir .\etc\conda\activate.d
    mkdir .\etc\conda\deactivate.d
    type NUL > .\etc\conda\activate.d\env_vars.bat
    type NUL > .\etc\conda\deactivate.d\env_vars.bat
    
  3. 编辑 .\etc\conda\activate.d\env_vars.bat 如下

    set MY_KEY='secret-key-value'
    set MY_FILE=C:\path\to\my\file
    
  4. 编辑 .\etc\conda\deactivate.d\env_vars.bat 如下

    set MY_KEY=
    set MY_FILE=
    

当您运行 conda activate analytics 时,环境变量 MY_KEYMY_FILE 将设置为写入文件的值。当您运行 conda deactivate 时,这些变量将被删除。

macOS 和 Linux#

  1. 通过在终端中运行 echo $CONDA_PREFIX,在您的终端窗口中找到 conda 环境的目录。

  2. 进入该目录并创建这些子目录和文件

    cd $CONDA_PREFIX
    mkdir -p ./etc/conda/activate.d
    mkdir -p ./etc/conda/deactivate.d
    touch ./etc/conda/activate.d/env_vars.sh
    touch ./etc/conda/deactivate.d/env_vars.sh
    
  3. 编辑 ./etc/conda/activate.d/env_vars.sh 如下

    #!/bin/sh
    
    export MY_KEY='secret-key-value'
    export MY_FILE=/path/to/my/file/
    
  4. 编辑 ./etc/conda/deactivate.d/env_vars.sh 如下

    #!/bin/sh
    
    unset MY_KEY
    unset MY_FILE
    

当您运行 conda activate analytics 时,环境变量 MY_KEYMY_FILE 将设置为写入文件的值。当您运行 conda deactivate 时,这些变量将被删除。

共享环境#

您可能希望与其他人共享您的环境,例如,让他们能够重新创建您已经完成的测试。为了让他们能够快速重现您的环境及其所有软件包和版本,请给他们您 environment.yml 文件的副本。

导出 environment.yml 文件#

注意

如果您的当前目录中已经存在 environment.yml 文件,它将在执行此任务时被覆盖。

  1. 激活要导出的环境:conda activate myenv

    注意

    myenv 替换为环境的名称。

  2. 将您的活动环境导出到新文件

    conda env export > environment.yml
    

    注意

    此文件同时处理环境的 pip 软件包和 conda 软件包。

  3. 将导出的 environment.yml 文件通过电子邮件发送或复制给其他人。

跨平台导出环境文件#

如果要使您的环境文件跨平台工作,可以使用 conda env export --from-history 标志。这将只包含您明确要求的软件包,而不是包含您环境中的每个软件包。

例如,如果您创建一个环境并安装 Python 和一个软件包

conda install python=3.7 codecov

这将下载并安装大量其他软件包以解决依赖项。这将引入可能不跨平台兼容的软件包。

如果您使用 conda env export,它将导出所有这些软件包。但是,如果您使用 conda env export --from-history,它将只导出您专门选择的软件包

(env-name) ➜  ~ conda env export --from-history
name: env-name
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.7
  - codecov
prefix: /Users/username/anaconda3/envs/env-name

注意

如果您在 macOS 上安装了 Anaconda 2019.10,您的前缀可能是 /Users/username/opt/envs/env-name

手动创建环境文件#

您可以手动创建环境文件 (environment.yml) 以与他人共享。

示例:一个简单的环境文件

name: stats
dependencies:
  - numpy
  - pandas

示例:一个更复杂的环境文件

name: stats2
channels:
  - javascript
dependencies:
  - python=3.9
  - bokeh=2.4.2
  - conda-forge::numpy=1.21.*
  - nodejs=16.13.*
  - flask
  - pip
  - pip:
    - Flask-Testing

注意

使用通配符

请注意,在复杂环境文件中定义一些版本时,使用了通配符 *。固定主版本和次版本,同时允许补丁为任何数字,这允许您使用您的环境文件获取任何错误修复,同时仍然保持环境的一致性。有关软件包安装值的更多信息,请参阅 软件包搜索和安装规范

在“channels”之外指定通道

您可能偶尔需要指定 conda 将用于安装特定软件包的通道。要实现此目的,请在 dependencies: 中使用 channel::package 语法,如上面的 conda-forge::numpy(版本号可选)中所示。指定的通道不需要出现在 channels: 列表中,如果您希望从社区通道(如 conda-forge)安装一些(但不是全部)软件包,这一点很有用。

可以通过在通道列表中添加 nodefaults 来排除默认通道。

channels:
  - javascript
  - nodefaults

这等同于将 --override-channels 选项传递给大多数 conda 命令。

environment.yml 中的通道列表中添加 nodefaults 与从 .condarc 文件中的 通道列表 中删除 defaults 类似。但是,更改 environment.yml 仅影响您的一个 conda 环境,而更改 .condarc 则影响所有环境。

有关从此 environment.yml 文件创建环境的详细信息,请参阅 从 environment.yml 文件创建环境

恢复环境#

Conda 会保存对您的环境所做的所有更改的历史记录,因此您可以轻松地“回滚”到之前的版本。要列出对当前环境的每个更改的历史记录:conda list --revisions

要将环境恢复到之前的修订版:conda install --revision=REVNUMconda install --rev REVNUM

注意

将 REVNUM 替换为修订版号。

例如:如果您想将环境恢复到修订版 8,请运行 conda install --rev 8

删除环境#

要删除环境,在您的终端窗口中,运行

conda remove --name myenv --all

您也可以使用 conda env remove --name myenv

要验证环境是否已删除,在您的终端窗口中,运行

conda info --envs

显示的环境列表中不应显示已删除的环境。