为什么 VS Code 调用错误的虚拟环境作为基础?

Why is VS Code calling the wrong virtual environment as base?

我每天通过 SSH 进入的服务器中有一些 conda 虚拟环境。从终端登录并列出环境给了我以下信息:

(base) [rgr6291@klc0201 ~]$ conda env list
# conda environments:
#
fomc                     /home/rgr6291/.conda/envs/fomc
r_conda                  /home/rgr6291/.conda/envs/r_conda
rfe_paper                /home/rgr6291/.conda/envs/rfe_paper
base                  *  /software/python-anaconda3/2019.10

所以我有基础和三个虚拟环境。我通常使用 Visual Studio 代码和远程 SSH 扩展在服务器上编辑代码。当系统提示我 select Python 解释器时,VS Code 识别所有这些环境:

事实证明,无论我是否在 fomc 环境中,从 VS Code 启动终端 window 都会导致不同的行为。

如果我 select,比如 rfe_paper 环境,并使用 VS Code 启动一个新终端,我会得到以下自动输出:

source activate rfe_paper
(base) [rgr6291@klc0201 HF_FOMC]$ source activate rfe_paper
(rfe_paper) [rgr6291@klc0201 HF_FOMC]$ 

它启动终端,然后激活所需的环境。但是,fomc 环境中的相同过程会导致不同的结果:

source /home/rgr6291/.conda/envs/fomc/bin/activate
(base) [rgr6291@klc0201 HF_FOMC]$ source /home/rgr6291/.conda/envs/fomc/bin/activate
(base) [rgr6291@klc0201 HF_FOMC]$ conda activate fomc

(base) [rgr6291@klc0201 HF_FOMC]$ conda env list
# conda environments:
#
base                  *  /home/rgr6291/.conda/envs/fomc
r_conda                  /home/rgr6291/.conda/envs/r_conda
rfe_paper                /home/rgr6291/.conda/envs/rfe_paper

请注意,开头有一个额外的 source 调用。不知何故 VS Code 被误导并认为 fomc 环境是基础环境。

  1. 可能是什么原因造成的?
  2. 如何解决这个问题?

昨天还好好的,今天好像坏了。唯一不同的是我今天早上把fomc里面安装好的包导出到一个yml文件中。我不知道这会如何影响行为。

对了,我也来汇报一下。这是~/.conda/envs/fomc/bin/activate的内容:

#!/bin/sh
_CONDA_ROOT="/home/rgr6291/.conda/envs/fomc"
# Copyright (C) 2012 Anaconda, Inc
# SPDX-License-Identifier: BSD-3-Clause
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
conda activate "$@"

我认为 CONDA_ROOT 是错误的,但我不知道它应该是什么。

提前致谢。

⚠️ Caution: This is an untested recommendation. Please make sure the whole procedure is clear before attempting. Be sure to back up any files before changing them!

我个人没有遇到过这种情况,但我怀疑解决它需要从 fomc 环境中删除 conda 包。这可能就足够了;但确保 .bashrc.bash_profile 中的 Conda 初始化代码设置为使用实际的 base 环境而不是 [= fomc 环境中的 55=] 点。

因此,我建议首先检查 .bashrc.bash_profile 并确保它们没有任何引用 fomc 的路径。如果他们这样做,那么整个初始化块,开始和结束于

# >>> conda initialize >>>
...
# <<< conda initialize <<<

应该被删除,然后应该重新运行 conda init 命令 使用真实的 base 环境 active,或者使用base conda.

的完整路径

完成后,重新启动 shell 并验证 conda 是否仍然有效并指向 base(即检查 which conda ).然后尝试从 fomc 中删除 conda 包,这样做 fomc活跃,即

conda remove -n fomc conda

应该是这样。