当我这样做时
conda info --envs
,我会得到所有环境及其位置的列表,如下所示:
# conda environments:
#
base * /Users/mbp/miniconda3
myenv /Users/mbp/miniconda3/envs/myenv
有没有办法从命令行获取
myenv
环境的位置?可能会像 conda info --envs myenv
那样得到
/Users/mbp/miniconda3/envs/myenv
有什么用例?
我想在 GitHub actions 中缓存所有环境依赖项。这必须在环境激活之前发生。如果我知道环境的位置,我可以缓存其中的所有文件。
conda info --envs | grep -Po 'myenv\K.*' | sed 's: ::g'
此 bash 命令将从 conda 检索所有环境,并找到从
myenv
开始的行,并将其交给 sed
命令,该命令又会删除空格
令人惊讶的是它对我有用
$(conda info --base)/envs/myenv
Conda 处理前缀解析的内部函数 (
locate_prefix_by_name
) 当前位于 conda.base.context
,因此可以避免使用如下脚本列出所有环境:
conda-locate.py
#!/usr/bin/env conda run -n base python
import sys
from conda.base.context import locate_prefix_by_name
print(locate_prexif_by_name(sys.argv[1]), end='')
用法
# make executable
chmod +x conda-locate.py
./conda-locate.py jupyter
# /Users/user/miniforge/envs/jupyter
您可能需要添加一个 try..catch 来处理
conda.exceptions.EnvironmentNameNotFound
异常。
这是一个老问题,但目前所有响应都依赖于设计为仅供人类读取的
conda
命令的输出格式。
您可以通过
--json
获取机器可解析的输出,然后使用 jq
以可靠的方式提取您需要的信息。
正如您通过运行
conda info --json
所看到的,机器可解析版本实际上并不包含环境名称...这是因为环境名称是由环境包含文件夹的名称定义,所以您可以做一些事情喜欢
$ conda info --json | jq -r '.envs[] | select(. | endswith("/${YOUR_ENV_NAME}") )'
-r
输出原始字符串(不是 JSON).envs[]
获取所有环境位置的列表| select( ... )
筛选出您想要的