如何找到运行代码的 conda 环境的名称?

我正在寻找一种很好的方法,从运行代码或交互式 Python 实例中找出我所在的 conda 环境的名称。

这个用例是,我在一个 miniconda 安装中使用 Python2和 Python3内核运行 Jupiter 笔记本电脑。默认的环境是 Py3。Py2有一个单独的环境。在一个笔记本文件内,我希望它尝试 conda install foo。我现在使用 subcommand来做这件事,因为我找不到与 pip.main(['install','foo'])等价的编程 conda。

问题是,如果笔记本是使用 Py2内核运行的,那么命令需要知道 Py2环境的名称才能在那里安装 foo。如果没有该信息,它将安装在默认的 Py3 env 中。我希望代码能够找出它所处的环境以及它自己的正确名称。

到目前为止,我想到的最好的解决办法是:

import sys


def get_env():
sp = sys.path[1].split("/")
if "envs" in sp:
return sp[sp.index("envs") + 1]
else:
return ""

是否有更直接/适当的方法来实现这一点?

122611 次浏览

非常简单,你可以

envs = subprocess.check_output('conda env list').splitlines()
active_env = list(filter(lambda s: '*' in str(s), envs))[0]
env_name = str(active_env).split()[0]

你想要 $CONDA_DEFAULT_ENV还是 $CONDA_PREFIX:

$ source activate my_env
(my_env) $ echo $CONDA_DEFAULT_ENV
my_env


(my_env) $ echo $CONDA_PREFIX
/Users/nhdaly/miniconda3/envs/my_env


$ source deactivate
$ echo $CONDA_DEFAULT_ENV  # (not-defined)


$ echo $CONDA_PREFIX  # (not-defined)

在巨蟒中:

import os
print(os.environ['CONDA_DEFAULT_ENV'])

对于通常更有用的绝对整个路径:

Python 3.9.0 | packaged by conda-forge | (default, Oct 14 2020, 22:56:29)
[Clang 10.0.1 ] on darwin
import os; print(os.environ["CONDA_PREFIX"])
/Users/miranda9/.conda/envs/synthesis

环境变量没有很好的文档。你可以在这里找到 CONDA_DEFAULT_ENV: Https://www.continuum.io/blog/developer/advanced-features-conda-part-1

我能找到的关于 CONDA_PREFIX的唯一信息是这个问题: Https://github.com/conda/conda/issues/2764

我用的是这个:

import sys
sys.executable.split('/')[-3]

它的优点是不假设 env 在路径中(并且嵌套在 envs下)。而且,它不需要通过 source activate激活环境。

编辑: 如果你想确保它在 Windows 上也能工作:

import sys
from pathlib import Path
Path(sys.executable).as_posix().split('/')[-3]

需要说明的是: sys.executable提供了当前 python 解释器的路径(不管是激活还是停用)——例如 '/Users/danielsc/miniconda3/envs/nlp/bin/python'。代码的其余部分只取上一个路径段中的第3个,这是环境所在文件夹的名称,通常也是 python 环境的名称。

由于与“如何确定我的 python 环境”相关的类似搜索会得到这个答案,我想我还会提到一种方法,可以找出当前运行代码的环境。 我检查 Pip二进制文件的位置,它指向 目前的环境中的 位置。通过查看以下命令的输出,可以轻松确定所处的环境。(请注意,如果您从您的全局环境/其他环境继承了 pip 包,则此解决方案不适用)

窗户命令提示符中:

where pip

如果你在一个 朱庇特笔记本里面,加一个叹号(!)在主机命令提示符中执行该命令的命令之前:

in[10]: !where pip

输出如下:

C:\Users\YourUsername\.conda\envs\YourEnvironmentName\Scripts\pip.exe
C:\ProgramData\Anaconda3\Scripts\pip.exe

YourEnvironment mentName 提供当前环境的名称。

Linux/Mac中,可以使用 which 命令代替 where: (未测试)。

对于 python3环境

which pip3

来自 朱庇特笔记本:

in[10]: !which pip3

这应该直接指向当前环境中的位置。

编辑: 哎呀,我没有注意到 艾沃的回答。让我们说我在它上面扩展了一点。


如果从终端运行 Python 脚本:

import os
os.system("conda env list")

这将列出所有的 conda 环境,从终端到 conda env list

稍微好一点:

import os
_ = os.system("conda env list | grep '*'")

_ =位将使对 os.system的调用的存在状态保持沉默(如果成功,则为 0) ,而 grep将仅使用激活的 conda 环境打印出该行。

如果你不从终端运行你的脚本(例如,它是通过 crontab调度的) ,那么上面的程序就没有任何地方“打印”结果。相反,您需要使用 Python 的 subprocess模块之类的东西。最简单的解决方案可能是运行:

import subprocess
output = subprocess.check_output("conda env list | grep '*'", shell=True, encoding='utf-8')
print(output)

也就是说,output是一个包含命令 conda env list输出的字符串,而不是它的退出状态(也可以检索,请参阅 subprocess模块的文档)。

现在您有了一个包含激活的 conda 环境中的信息的字符串,您可以执行您需要的任何测试(使用正则表达式)来执行(或不执行)问题中提到的安装。

注意。
当然,如果您的脚本不是从终端运行的,那么上面的代码块中的 print(output)将不会产生任何效果,但是如果您在从终端运行的脚本中测试该代码块,那么您可以验证它是否满足您的需要。例如,可以将此信息打印到日志文件中(建议使用 logging模块)。

在 Windows 上(可能可以工作,但是没有在 Linux 上测试过) :

import sys
import os


# e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
print( sys.exec_prefix.split(os.sep)[-1] )

使用环境变量或假设路径分隔符为“/”的答案在我的 Windows/Anaconda3环境中不起作用。

这里假设您处于一个环境中。

  1. 有几个答案建议使用“ which pip”、“ which python”或“ conda env list to grep the default”。如果用户正在执行以下操作,那么这种方法就可以起作用: $conda 激活 env _ name; $python... 或 $jupyter 笔记本/jupyterlab

  2. 当用户在不激活 conda 的情况下直接调用 python 时,方法 # 1将无法工作: 例如,$/opt/conda/envs/my _ env/bin/python (其中 my _ env 是 env 的名称)

  3. 在 Jupyter 笔记本的更一般的情况下,可以选择任何一个可用的 conda env/kernel,选择的 conda env/kernel 可能不同于默认的 conda env/kernel。

  4. 因此,解决方案是检查当前 Python 的可执行文件或路径,就像前面几个人发布的那样。基本上,sys.path 返回可执行文件的完整路径,然后可以使用 split 来计算 envs/之后的名称,即 env _ name。问这个问题的人给了一个很好的答案,除了错过了这个... 。

  5. 我不认为任何职位照顾的基础环境的特殊情况。注意,来自 base env 的 python 只是/opt/conda/bin/python。所以可以简单地添加下面的代码片段做一个匹配 如果/opt/conda/bin/python 在 sys.path 中: 返回‘ base’

  6. 这里我们假设 conda 安装在/opt/conda 上。对于真正通用的解决方案,可以使用 $conda info —— root 查找安装路径。

conda info

直接列出了在第一行中您可以看到的所有信息

active environment: (some name)
active env location: (location of active environment)

我想这是最清楚的方法。

在像 Jupiter Notebook 或 Jupiter Lab 这样的交互式环境中,在键入命令之前应该使用% ,如下所示,

%conda info

对于通常更有用的绝对整条路径:

Python 3.9.0 | packaged by conda-forge | (default, Oct 14 2020, 22:56:29)
[Clang 10.0.1 ] on darwin
import os; print(os.environ["CONDA_PREFIX"])
/Users/miranda9/.conda/envs/synthesis
  1. 打开水蟒提示符
  2. 输入“ conda info —— env”

它将给出所有虚拟环境的列表 激活虚拟环境

  1. “ conda 激活 Virtual _ Environment _ name”