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

Aln*_*lam 23 python env anaconda conda jupyter

我正在寻找一种很好的方法来计算我在运行代码或交互式python实例中的conda环境的名称.

用例是我使用miniconda安装的Python 2和Python 3内核运行Jupyter笔记本.默认环境是Py3.Py2有一个单独的环境.在笔记本文件中,我希望它尝试conda install foo.我现在正在使用subcommand这个,因为我找不到类似的程序性conda pip.main(['install','foo']).

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

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

import sys

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

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

NHD*_*aly 49

你想要$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)
Run Code Online (Sandbox Code Playgroud)

在python中:

In [1]: import os
   ...: print os.environ['CONDA_DEFAULT_ENV']
   ...:
my_env
Run Code Online (Sandbox Code Playgroud)

环境变量没有很好地记录.你可以在CONDA_DEFAULT_ENV这里找到:https: //www.continuum.io/blog/developer/advanced-features-conda-part-1

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


Ant*_*ine 7

编辑: 哎呀,我没有注意到伊沃的回答。假设我正在对此进行一些扩展。


如果您从终端运行 python 脚本:

import os
os.system("conda env list")
Run Code Online (Sandbox Code Playgroud)

这将列出所有 conda 环境,从带有conda env list.

稍微好一些:

import os
_ = os.system("conda env list | grep '*'")
Run Code Online (Sandbox Code Playgroud)

_ =位将使调用的存在状态静音os.system0如果成功),并且grep仅打印出激活的 conda 环境的行。

如果您不从终端运行脚本(例如,它是通过 安排的crontab),那么上面的内容将没有任何地方可以“打印”结果。相反,您需要使用类似 python 的subprocess模块之类的东西。最简单的解决方案可能是运行:

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

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

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

评论。
当然,print(output)如果您的脚本不是从终端运行,则上面的块将不起作用,但是如果您在从终端运行的脚本中测试该块,那么您可以验证它是否为您提供了您想要的内容。例如,您可以将此信息打印到日志文件中(logging建议使用该模块)。


Alk*_*ian 6

conda info
Run Code Online (Sandbox Code Playgroud)

直接列出所有信息,在第一行你可以看到

active environment: (some name)
active env location: (location of active environment)
Run Code Online (Sandbox Code Playgroud)

我想这是最清楚的方法。

在 Jupyter Notebook 或 Jupyter Lab 等交互式环境中,您应该在键入命令之前使用 %,如下所示,

%conda info
Run Code Online (Sandbox Code Playgroud)


Ivo*_*Ivo 5

很简单,你可以做

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]
Run Code Online (Sandbox Code Playgroud)

  • 运行此命令时会出现错误,除非我将命令作为列表 - `['conda','env','list']` -- 然后无论我使用 Py2 运行此命令,我都会得到相同的答案(root)或 Py3 内核。然而,检查“sys.path”会显示每个路径的不同结果。 (2认同)

Dan*_*der 5

我正在使用这个:

import sys
sys.executable.split('/')[-3]
Run Code Online (Sandbox Code Playgroud)

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

编辑:如果您要确保它也可以在Windows上运行:

import sys
from pathlib import Path
Path(sys.executable).as_posix().split('/')[-3]
Run Code Online (Sandbox Code Playgroud)

澄清sys.executable一下:例如,为您提供当前python解释器的路径(与激活/停用无关)'/Users/danielsc/miniconda3/envs/nlp/bin/python'。其余代码仅从最后一个路径段开始取第3个,这是环境所在的文件夹的名称,通常也是python环境的名称。

  • 如果您运行的 python 不是来自活动环境,则这是不正确的。 (2认同)
  • 对我来说是 `Path(sys.executable).as_posix().split('/')[-2]` (2认同)

MZB*_*MZB 5

在 Windows 上(可能可以工作,但在 Linux 上未经测试):

import sys
import os

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

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

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