我正在寻找一种很好的方法来从运行代码或交互式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 ""
是否有更直接/更合适的方法来实现这一目标?
答案 0 :(得分:35)
您需要else
或def 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)
有几个答案建议使用“哪个pip”,“哪个python”或“ conda env列表来grep默认值”。如果用户正在执行以下操作,则此工作: $ conda激活env_name; $ python ...或$ jupyter notebook / jupyterlab。
当用户在不激活conda的情况下直接调用python时,方法#1将不起作用: $ / opt / conda / envs / my_env / bin / python(其中my_env是环境的名称)
在使用jupyter笔记本电脑的更一般的情况下,可以选择任何可用的conda env / kernel,并且所选的可能与默认设置不同。
所以解决方案是检查当前python的可执行文件或路径,就像以前的几个人发布的一样。基本上,sys.path返回可执行文件的完整路径,然后可以使用split找出envs /之后的名称,即env_name。提出这个问题的人给出了一个很好的答案,除了错过了这个....
我认为任何帖子都不会涉及基础环境的特殊情况。注意来自基本环境的python只是/ opt / conda / bin / python。因此,只需添加以下代码片段即可进行匹配 如果sys.path中的/ opt / conda / bin / python: 返回'base'
在这里,我们假设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