我正在寻找一种很好的方法来从运行代码或交互式 python 实例中找出我所在的 conda 环境的名称。
用例是我正在运行Jupyter笔记本,其中包含来自miniconda安装的Python 2和Python 3内核。默认环境为 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 ""
有没有更直接/更合适的方法来实现这一目标?
你想要$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
conda info
直接列出所有信息,在第一行可以看到
active environment: (some name)
active env location: (location of active environment)
我想这是最清楚的方法。
在 Jupyter Notebook 或 Jupyter Lab 等交互式环境中,应在键入命令之前使用 %,如下所示:
%conda info
我正在使用这个:
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 环境的名称。
编辑:哎呀,我没有注意到伊沃的回答。 假设我正在扩展一点。
如果您从终端运行 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
模块(。
很简单,你可以做
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]
在 Windows 上(可能有效,但在 Linux 上未经测试(:
import sys
import os
# e.g. c:UsersdogbertAnaconda3envsmyenvironment
print( sys.exec_prefix.split(os.sep)[-1] )
使用环境变量或假设路径分隔符为"/"的答案在我的 Windows/Anaconda3 环境中不起作用。
这假定您处于某个环境中。
"如何确定我的 python 环境"相关的类似搜索导致了这个答案,我想我还会提到一种方法,我找出我当前正在运行代码的环境。我检查我的 pip 二进制文件的位置,该位置指向当前环境中的一个位置。通过查看以下命令的输出,您可以轻松确定您所处的环境。(请注意,如果您从全局环境/其他环境继承了 pip 包,则此解决方案不适用(
在 Windows 命令提示符下:
where pip
如果您在 Jupyter 笔记本中,请在命令前添加一个感叹号 (!( 以在主机命令提示符下执行命令:
in[10]: !where pip
输出将如下所示:
C:UsersYourUsername.condaenvsYourEnvironmentNameScriptspip.exe
C:ProgramDataAnaconda3Scriptspip.exe
您的环境名称会给出您当前环境的名称。
在 Linux/Mac 中,您可以使用 where 命令而不是 where:(未测试(。
对于 python3 环境
which pip3
从Jupyter笔记本:
in[10]: !which pip3
这应直接指向当前环境中的位置。
-
有几个答案建议使用"哪个点","哪个python"或"conda env列表来grep默认值"。如果用户正在执行以下操作,则此方法有效:$ 康达激活env_name;$ 蟒蛇 ...或$ Jupyter Notebook/Jupyterlab。
-
当用户在没有 conda 激活的情况下直接调用 python 时,方法 #1 将不起作用:例如 $/opt/conda/envs/my_env/bin/python(其中 my_env 是 env 的名称(
-
在更一般的情况下,jupyter notebook 可以选择任何一个可用的 conda env/内核,并且选择的那个可能与默认值不同。
-
因此,解决方案是检查当前python的可执行文件或路径,就像几个人之前发布的那样。基本上,sys.path 返回可执行文件的完整路径,然后可以使用 split 来确定 envs/之后的名称,这将是env_name。问这个问题的人给出了一个很好的答案,除了错过了这个....
-
我认为任何帖子都没有处理基本环境的特殊情况。请注意,来自base env的python只是/opt/conda/bin/python。所以可以简单地添加以下代码片段做一个匹配如果 sys.path 中的/opt/conda/bin/python:返回"基础">
-
这里我们假设 conda 安装在/opt/conda 上。对于真正通用的解决方案,可以使用 $ conda info --root 来查找安装路径。
对于通常更有用的绝对整个路径:
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
- 打开蟒蛇提示符
- 键入"康达信息 --env">
它将给出所有虚拟环境的列表激活虚拟环境
- "康达激活virtual_environment_name">