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

97

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

使用案例是我从miniconda安装中运行Python 2和Python 3内核的Jupyter笔记本。默认环境为Py3。有一个单独的Py2环境。在笔记本文件中,我希望它尝试通过conda install foo来安装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 ""

有更直接/合适的方法来完成这个吗?


除非我错了,conda install x会安装到当前环境中:所以如果笔记本在Python 2环境中,则会安装到该环境中。 - user5920214
1
我刚刚尝试了以下实验。在从默认anaconda环境启动的Jupyter笔记本中(但同时有Py2和Py3 ipython内核可用),我在一个单元格中运行了!conda env list,在另一个单元格中运行了import subprocess; print(subprocess.check_output(['conda','env', 'list']).decode())。无论我在Py2还是Py3中运行笔记本,两者都显示默认环境处于活动状态,因此发出对操作系统的命令可能会在jupiter服务器使用的任何环境中执行。 - Alnilam
我需要更简单的方法,如何从shell中找出你正在运行哪个conda环境?(顺便说一句,你可以从Python中调用该命令) - Charlie Parker
回答我自己的评论 conda env list* 指向当前打开的环境。我这样做的原因是尽管名称出现在终端名称提示符上,但当提示符与我正在使用的环境不匹配时(例如使用 vscode),我会遇到问题。 - Charlie Parker
如果您想要绝对路径,请执行 $ echo $CONDA_PREFIX 并查看输出: /home/miranda9/miniconda3/envs/metalearning - Charlie Parker
在Python中执行以下操作:import os; print(os.environ["CONDA_PREFIX"]),输出为/Users/miranda9/.conda/envs/synthesis - Charlie Parker
10个回答

156
您需要使用$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_ENV的提及: https://www.continuum.io/blog/developer/advanced-features-conda-part-1 我在这个问题中只找到了有关CONDA_PREFIX的信息: https://github.com/conda/conda/issues/2764

Python解决方案不适用于py3,因为括号的使用方式不同。 - Textcape
1
print(os.environ['CONDA_DEFAULT_ENV']) - Textcape
太好了。我只想补充一下,source deactivate已经被弃用了,现在你必须使用conda deactivate - norman123123
但这并不是整个路径,只是头部的名称...就像这样/home/miranda9/miniconda3/envs/metalearning是我想要的。所以执行import os; print(os.environ["CONDA_PREFIX"]) - Charlie Parker

31
conda info

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

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

我想这是最清晰的方式。

在像Jupyter Notebook或Jupyter Lab这样的交互式环境中,您应该在输入命令前使用%符号,就像下面这样:

%conda info

19

我正在使用这个:

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 解释器的路径(无论是激活还是取消激活)-- 例如 '/Users/danielsc/miniconda3/envs/nlp/bin/python'。其余代码只是获取倒数第三个路径段,这是环境所在文件夹的名称,通常也是 Python 环境的名称。


这个怎么能够给出 conda 环境的名称呢? - Antoine
2
如果你正在运行一个不属于当前环境的Python版本,那么这是错误的。 - Christopher Barber
2
对我来说,它是 Path(sys.executable).as_posix().split('/')[-2] - Triamus

7

编辑:糟糕,我没有注意到Ivo的回答。让我们说我在它的基础上再做一点补充。


如果您从终端运行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模块)。


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]

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

5

在Windows上(Linux上可能也可以但未经测试):

import sys
import os

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

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

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


3
由于与“如何确定我的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

From Jupyter notebook:

in[10]: !which pip3

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

1
这解答了我的困惑。我使用 pip3 install 安装了 Jupyter Notebook,Jupyter Notebook 将在由 pip3 给出的环境中运行,而不是 conda。我已经安装了 conda,但 Anaconda 没有安装在我的 CentOS Linux 上。 - sonictl

2
  1. 有些答案建议使用'which pip'、'which python'或'conda env list to grep the default'。如果用户执行类似于以下命令的操作,则可以工作:$ conda activate env_name; $ python ... 或者 $ jupyter notebook/jupyterlab。

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

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

  4. 因此,解决方案是检查您当前python的可执行文件或路径,就像之前几位人士发布的那样。基本上,sys.path返回可执行文件的完整路径,然后可以使用split来找出envs/之后的名称,这将是env_name。提出这个问题的人给出了一个非常好的答案,只是缺少了这个...

  5. 我认为没有任何帖子考虑到基本环境的特殊情况。注意,来自基本环境的python只是/opt/conda/bin/python。因此,可以简单地添加以下代码片段进行匹配if /opt/conda/bin/python in sys.path: return 'base'

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


2
  1. 打开Anaconda提示符
  2. 键入“conda info --env”

它会给出所有虚拟环境的列表,要激活虚拟环境

  1. “conda activate 虚拟环境名称”

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接