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

How do I find the name of the conda environment in which my code is running?

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

用例是我是 运行 Jupyter notebooks,带有来自 miniconda 安装的 Python 2 和 Python 3 内核。默认环境是 Py3。 Py2 有单独的环境。在笔记本文件中,我希望它尝试 conda install foo。我现在正在使用 subcommand 来执行此操作,因为我找不到与 pip.main(['install','foo']) 等效的程序化 conda。

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

到目前为止我得到的最佳解决方案是:

import sys

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

是否有更多 direct/appropriate 方法来完成此操作?

很简单,你可以做到

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)

在python中:

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_ENVhttps://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]

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

编辑:如果您想确保它也适用于 Windows:

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

澄清一下:sys.executable 为您提供当前 python 解释器的路径(不管 activate/deactivate)——例如 '/Users/danielsc/miniconda3/envs/nlp/bin/python'。其余代码只取最后一个路径段的第 3 个,这是环境所在文件夹的名称,通常也是 python 环境的名称。

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

Windows命令提示符中:

where pip

如果您在 Jupyter Notebook 中,请在命令前添加感叹号 (!) 以在主机命令提示符下执行命令:

in[10]: !where pip

输出将如下所示:

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

YourEnvironmentName 给出您当前环境的名称。

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

对于python3环境

which pip3

来自 Jupyter 笔记本:

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 安排的),那么上面的任何地方都不会 "print" 结果。相反,您需要使用类似 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'。如果用户正在做类似的事情,这项工作: $畅达激活env_name; $ python ... 或 $ jupyter notebook/jupyterlab。

  2. 当用户在没有 conda activate 的情况下直接调用 python 时,方法 #1 将不起作用:例如$ /opt/conda/envs/my_env/bin/python(其中 my_env 是 env 的名称)

  3. 在使用 jupyter notebook 的更一般情况下,可以 select 任何可用的 conda env/kernel,而 selected 可能不会与默认值相同。

  4. 所以解决方案是检查您当前 python 的可执行文件或路径,就像许多人之前 posted 一样。基本上,sys.path return 是可执行文件的完整路径,然后可以使用 split 找出 envs/ 之后的名称,即 env_name。问这个问题的人回答的还不错,就是漏了这个....

  5. 我认为没有任何 post 处理基本环境的特殊情况。注意基础环境中的 python 只是 /opt/conda/bin/python。所以可以简单地添加以下代码片段来进行匹配 如果 /opt/conda/bin/python 在 sys.path 中: return'base'

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

conda info

直接列出第一行你能看到的所有信息

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

我想这是最清楚的方法。

在 Jupyter Notebook 或 Jupyter 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