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

时间:2016-04-11 03:59:19

标签: python anaconda jupyter conda env

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

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

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

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

import sys

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

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

7 个答案:

答案 0 :(得分:35)

您需要elsedef roman(num, output="") if num < 1 return output else ROMAN_HASH.each do |k, v| return roman(num - k, output+v) if num >= k end end end

$CONDA_DEFAULT_ENV

在python中:

$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) https://www.continuum.io/blog/developer/advanced-features-conda-part-1

我能找到In [1]: import os ...: print os.environ['CONDA_DEFAULT_ENV'] ...: my_env 的唯一信息就是这个问题: https://github.com/conda/conda/issues/2764

答案 1 :(得分:3)

我正在使用这个:

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

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

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

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

答案 2 :(得分:1)

编辑:糟糕,我没有注意到Ivo的回答。假设我正在对此进行扩展。


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

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

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

好一点:

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 output 的字符串,而不是退出状态(也可以检索其退出状态,请参见{{1}的文档) }模块)。

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

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

答案 3 :(得分:0)

由于与“如何确定我的python环境”相关的类似搜索导致了此答案,因此我想我还将提到一种找出当前从中运行代码的环境的方法。 我检查了 pip 二进制文件的位置,该文​​件指向当前环境中的位置。通过查看以下命令的输出,您可以轻松确定您所处的环境。(请注意,如果您已从全局环境/其他环境继承了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

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

答案 4 :(得分:0)

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

import sys
import os

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

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

这假定您在环境中。

答案 5 :(得分:0)

  1. 有几个答案建议使用“哪个pip”,“哪个python”或“ conda env列表来grep默认值”。如果用户正在执行以下操作,则此工作: $ conda激活env_name; $ python ...或$ jupyter notebook / jupyterlab。

  2. 当用户在不激活conda的情况下直接调用python时,方法#1将不起作用: $ / opt / conda / envs / my_env / bin / python(其中my_env是环境的名称)

  3. 在使用jupyter笔记本电脑的更一般的情况下,可以选择任何可用的conda env / kernel,并且所选的可能与默认设置不同。

  4. 所以解决方案是检查当前python的可执行文件或路径,就像以前的几个人发布的一样。基本上,sys.path返回可执行文件的完整路径,然后可以使用split找出envs /之后的名称,即env_name。提出这个问题的人给出了一个很好的答案,除了错过了这个....

  5. 我认为任何帖子都不会涉及基础环境的特殊情况。注意来自基本环境的python只是/ opt / conda / bin / python。因此,只需添加以下代码片段即可进行匹配 如果sys.path中的/ opt / conda / bin / python: 返回'base'

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

答案 6 :(得分:0)

conda info

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

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

我想这是最清晰的方法。

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

%conda info