另一个 conda env 中安装了哪个 Python 版本

问题描述 投票:0回答:4

如何找出在知道名称但不想激活该环境的

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
4个回答
20
投票

这是一行代码,将打印环境和相关的 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。

欢迎您根据自己的喜好调整格式。


2
投票

我对 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

2
投票

参考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") }

0
投票

这是我的一句俏皮话的尝试:

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 二进制文件。

虽然有点粗糙,但很快就能完成工作。

© www.soinside.com 2019 - 2024. All rights reserved.