如何找出在知道名称但不想激活该环境的
conda
环境中安装了哪个Python版本?
背景:我选择了偷懒的方式在我的
python3.6
机器上获取 Ubuntu 14.04
并安装了 conda
。但我想根据环境是否有 PYTHONPATH
或 python2.x
将某些目录添加到我的 python3.x
中,我计划通过包装 conda
的 activate
来做到这一点,如下所示:
PYMAJOR=$(a_miracle_occurs $CONDAENV)
BASHRC=$(cat <<EOF
source ~/.bashrc
source activate $CONDAENV
export PATH=...
export PYTHONPATH=".../modules$PYMAJOR"
"
EOF
)
bash --rcfile <(echo "${BASHRC}")
我对
python
的颠覆没有兼容性问题,并且我不想 setup.py develop
PYTHONPATH
中的模块,因为在结构层面上仍然有太多的变化。
备注:我知道
conda list -n ENVNAME
,但这将涉及解析人类可读的输出,我会觉得最好有一些东西以机器可读的形式检索信息。
这是一行代码,将打印环境和相关的 python 版本:
conda env list | grep -v "^$\|#" |awk '{print $1;}'|xargs -I{} -d "\n" sh -c 'printf "Env: {}\t"; conda list -n {} |grep "^python\s";'
这是一个示例输出:
Env: base python 2.7.14 h1571d57_29
Env: python37 python 3.7.0 hc3d631a_0
基本原理:使用
conda env list
获取环境列表,排除空行和 #,使用 conda list -n <env>
解析、打印环境包,并使用 grep for python。
欢迎您根据自己的喜好调整格式。
我对 anaconda 一点也不熟悉,接下来的一切都是一个疯狂的猜测。如果 anaconda 在内部使用 virtualenv,则应该将 virtualenv 安装到某个目录中(可能类似于
$ANACONDA_HOME/envs/$CONDAENV
?)。
如果是这种情况,那么只需运行
$ANACONDA_HOME/envs/$CONDAENV/bin/python --version
即可检索 Python 版本。
编辑以解决OP评论:
仅返回版本字符串,请尝试:
$ANACONDA_HOME/envs/$CONDAENV/bin/python -c 'import platform; print(platform.python_version())'
>>> 3.6.0
参考elomage的答案,我编写了一个具有相同行为的powershell命令。
conda env list | Select-String -Pattern "^$|#" -NotMatch | ForEach-Object{($_ -split "\s+")[0]} | %{ "Env: {0}`t{1}" -f $_, (conda list -n $_ | Select-String -Pattern "^python\s") }
这是我的一句俏皮话的尝试:
cenvs=$(conda env list | grep -ve '^#'); paste <(echo "$cenvs" | awk '{printf "%-15s\n", $1}') <(echo "$cenvs" | awk '
{print $2}' | xargs -I {} sh -c '{}/bin/python --version')
与 @elomage 的答案不同,这个只调用
conda list
一次,而不是每个环境调用一次,这极大地加快了速度。
它的工作原理是获取
conda env list
打印的每个环境的路径并附加 bin/python
并使用 --version
标志执行该 python 二进制文件。
虽然有点粗糙,但很快就能完成工作。