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
编辑: 哎呀,我没有注意到伊沃的回答。假设我正在对此进行一些扩展。
如果您从终端运行 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.system(0如果成功),并且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建议使用该模块)。
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)
很简单,你可以做
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)
我正在使用这个:
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环境的名称。
在 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 环境中不起作用。
这假设您处于一个环境中。
| 归档时间: |
|
| 查看次数: |
22633 次 |
| 最近记录: |