【问题标题】:Why is conda init updating my .bash_profile incorrectly?为什么 conda init 错误地更新了我的 .bash_profile?
【发布时间】:2020-03-28 18:26:54
【问题描述】:

在关注 these steps 并安装 conda 之后,conda init 似乎出于某种原因错误地更新了我的 .bash_profile。它在运行.bashrc 之后添加它的内容,因此当bash 启动时,我的所有conda 内容由于某种原因没有正确启动。我最终不得不手动将.bash_profile 更改为如下所示:

(automl) brandBrandoParetoopareto~ $ cat .bash_profile
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/brandBrandoParetoopareto/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/Users/brandBrandoParetoopareto/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/Users/brandBrandoParetoopareto/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/Users/brandBrandoParetoopareto/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

我安装它的方式是使用我认为是the official installation

sh Anaconda3-2020.02-MacOSX-x86_64.sh

但这似乎会导致问题(例如,conda init bash 没有在正确的位置添加东西到.bash_profile。图形/dmg 安装程序甚至出于某种原因在~/opt 安装东西)。我概述了对我有用的 hacky 解决方案here,但我认为这不是正确的做事方式。

是什么导致了我的问题,我该如何解决?

【问题讨论】:

  • 这与编程有什么关系?为什么这里会有人调试他们损坏的安装脚本?
  • conda 没有对您的.bash_profile 进行任何类型的分析;它只是将其块附加到文件的末尾。如果您的 .bashrc 包含需要在 conda 初始化之后获取它的内容,则您有责任根据需要调整 .bash_profile

标签: python bash anaconda conda


【解决方案1】:

正如 chepner 的评论所说,正如我自己最终发现的那样,conda init 由于某种原因无法开箱即用(例如,如果它修改了.bash_profile,很明显用户将运行他们的.bashrc文件在那里的某个地方,所以它应该在此之前正确添加它的内容,或者至少在恕我直言)。无论如何,这是一个工作文件的例子:

(automl) brandBrandoParetoopareto~/automl-meta-learning $ cat ~/.bash_profile 
echo ----Running .bash_profile

conda -V
python -V
echo $PATH
echo $PATH | tr ":" "\n"

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/brandBrandoParetoopareto/anaconda3/envs/automl/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/Users/brandBrandoParetoopareto/anaconda3/envs/automl/etc/profile.d/conda.sh" ]; then
        . "/Users/brandBrandoParetoopareto/anaconda3/envs/automl/etc/profile.d/conda.sh"
    else
        export PATH="/Users/brandBrandoParetoopareto/anaconda3/envs/automl/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

echo ----Completed running .bash_profile

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

在我手动更改后。

我没想到我需要自己修改这些东西。也许我不应该信任命令/安装程序等,而是更频繁地查看他们终端的输出。


另外,如果你像我一样在 vscode 中使用集成终端,情况会更糟。为此,请阅读此内容以避免错误/奇怪的行为:https://code.visualstudio.com/updates/v1_36#_launch-terminals-with-clean-environments

在干净的环境中启动终端 VS 中的集成终端 代码的行为总是与普通终端略有不同, 特别是在 Linux 和 macOS 上。原因是环境 总是继承自 VS Code 的窗口(实例)和 VS 代码/电子相关的环境变量被删除,而 普通终端通常会从 Dock/Start 菜单启动 并使用系统环境。这可能会导致某些问题 场景,例如 Python 虚拟环境被破坏,因为 他们如何使用 $PATH 变量。

有一个新的预览选项,terminal.integrated.inheritEnv,它 当 false 导致终端不使用 VS Code 的环境。

相反,根据平台,它将执行以下操作:

Linux:获取和使用VS的父进程的环境 代码的“主要过程”。 macOS:拉一把重要的环境 当前环境中的变量,仅包含它们。 最终我们希望 macOS 的行为与 Linux 相同,但 目前是获取环境的问题。窗户:目前 此设置不影响 Windows。主要可见结果 将 inheritEnv 设置为 false 是 $SHLVL(shell 级别)现在应该是 1 和 $PATH 不应包含重复的路径,前提是您的启动 脚本不会有意包含它们。

terminal.integrated.inheritEnv 的默认值为 true,即 以前的行为,但我们可能会将值切换为 false 未来。

完全关闭和打开 vscode 似乎也很有帮助。

希望这将节省人们更改 bash 文件以及重新安装和卸载一堆东西的日子。

另一个有用的提示是转到 vscode 的左上角,上面写着code 点击它,然后转到首选项,然后是设置。然后您可以通过取消单击/选择将terminal.integrated.inheritEnv 更改为 false。

【讨论】:

  • 用户将在文件末尾获取.bashrc这一点并不明显。没有conda 可以知道要查找的nothing 标准。它所能做的就是将其块追加到文件的末尾,并让用户将它放在相对于他们的现有代码所属的位置。
  • @chepner 我的印象是,在运行.bash_profile 之后,获取.bashrc 是标准的。也许我弄错了(为什么我认为它会是obvious)。如果 conda 在将它附加到它的位置之前询问用户,也许会很好。 Idk,也许我是唯一一个认为运行 .bashrc 是标准的人。
  • 老实说,如果文档只是简单地说明 what 是必要的,并让用户决定哪个文件以及该文件中的位置会简单得多,代码需要放置。
  • @chepner 非常令人沮丧的是,conda 从来没有告诉我们在哪里附加它。 Conda init 只是盲目地执行它并产生许多问题。希望某个地方它说一般应该去哪里。
猜你喜欢
  • 2023-01-27
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2012-04-02
  • 2016-10-30
相关资源
最近更新 更多