【问题标题】:Best Practices with Anaconda and BrewAnaconda 和 Brew 的最佳实践
【发布时间】:2017-08-09 03:28:11
【问题描述】:

我刚买了一台装有 OSX Sierra 的新 Macbook,所以想确保我的开发环境设置正确。

我希望遵循此处提到的“最佳实践”:https://github.com/nicolashery/mac-dev-setup

我需要 Python 2.x 来工作(urllib、Pandas、Numpy、Scikit-learn),而 Python 3.x 需要我正在学习的一些在线课程(Pandas、Numpy、Django)。 我已经安装了 Python 2 和 3,分别使用 brew install pythonbrew install python3

但是,在这个链接上,没有提到 Anaconda,只有 IPython。 鉴于我已经通过 Homebrew 安装了 Python 2 和 3,是否建议使用 anaconda,或者我应该坚持使用上面 Github 链接中提到的标准 IPython? 看完这篇文章我很困惑:OS X - Deciding between anaconda and homebrew Python environments

如果 Brew 和 Anaconda 确实可以一起工作,我可以采取哪些具体步骤来确保两个版本之间没有冲突?

【问题讨论】:

  • 自制酒桶....brew cask install anaconda
  • @cricket_007 该命令冻结为 'PREFIX=/usr/local/anaconda3
  • @shuhalo 好吧,我的 Python 通常使用 pyenv 而不是 Homebrew
  • @shuhalo 在输出后的一段时间内它不会提供任何更新,但它不会在我的机器上冻结。
  • 我觉得@cricket_007 的方法是正确的方法,但是:(a)它应该写成答案,而不仅仅是评论,并且(b)它应该有更多 详细信息,比如为什么最好先安装homebrew,然后再安装conda via homebrew。我不相信这是最好的方法,即使我觉得它是。这种方法背后的推理会很有帮助,尤其是在它如何影响您的 $PATH 变量以及 Anaconda 和 Python 的存储位置方面。

标签: python macos homebrew anaconda


【解决方案1】:

brewconda 往往不能很好地配合使用,但我认为我的设置到目前为止对我来说效果很好。它的灵感来自this post

您可以将以下代码添加到您的.zshrc

# Deactivates conda before running brew. 
# Re-activates conda if it was active upon completion.

brew() {
    local conda_env="$CONDA_DEFAULT_ENV"
    while [ "$CONDA_SHLVL" -gt 0  ]; do
        conda deactivate
    done
    command brew $@
    local brew_status=$?
    [ -n "${conda_env:+x}" ] && conda activate "$conda_env"
    return "$brew_status"
}

您想在运行brew 之前停用conda,以便brew 在尝试安装某些东西时在您的PATH 中找不到conda 包。事实上,brew doctor 会抱怨如果您在运行 brew 之前没有停用 conda,正如我在上面链接到的帖子中提到的那样。 (另见this question。)

我应该提到的一件事是conda 环境“堆栈”,但我上面编写的brew() 函数不会跟踪您的环境堆栈。 (有关跟踪此功能的版本,请参见下文。)例如,如果您在conda 环境oldenv 处于活动状态时执行conda activate newenv,则conda deactivate 会将您返回到oldenv。但是,如果您在激活oldenvnewenv 之后使用我上面编写的函数运行brew,则运行conda deactivate 不会让您返回oldenv,而是会完全停用您的conda 环境。

这个函数在运行brew 时也可能会产生一些不必要的开销,因为我相信你只需要在运行brew install 时关闭你的conda 环境。也就是说,如果你是那种足够关心开销的人,那么这个答案可能不会告诉你任何你不知道的事情。

最后一点,brew cask install anaconda 在我看来并不是一个好主意,因为 conda 被设计为安装在 $HOME 中,但 brew cask 将希望将其安装在 /usr/local 中,这样可能导致不可预测的行为。

编辑:这里是 brew 函数的一个版本,它让你的 conda 环境保持原样:

brew() {
    local -a conda_envs
    while [ "$CONDA_SHLVL" -gt 0  ]; do
        conda_envs=("$CONDA_DEFAULT_ENV" $conda_envs)
        conda deactivate
    done
    command brew $@
    local brew_status=$?
    for env in $conda_envs; do
        conda activate "$env"
    done
    unset env
    return "$brew_status"
}

我已经在 Zsh 中对此进行了测试。我认为它不会在 Bash 中工作。如果您想在 Bash 中使用它,您需要将 for 循环声明更改为类似 for env in ${conda_envs[@]} 的内容。但是,我没有对此进行测试,因此请在使用前测试它是否能满足您的需求。

【讨论】:

  • 将函数的整个主体放在子shell(括号对)中是否可以使brew正常运行并“重新激活”(通过退出子shell)conda?
  • @Mark 道歉,我有一段时间没上 SE了,所以我才看到你的评论。这可能有效,我不确定。你测试了吗?一种查看方法是使用brew doctor 尝试它,如果它在你的PATH 中找到另一个版本的Python,它会报错。顺便说一句,如果您使用 Zsh,我认为可以轻松修改此函数以跟踪您的 conda 环境堆栈。
  • @Mark 我已经用您可能与您的问题相关的内容更新了我的答案。
  • 仅供参考,parens 方法似乎在 bash 中有效,只需制作 {->{(, }->)} 并从原始文件中删除 [ -n "${conda_env:+x}" ] && conda activate "$conda_env"
【解决方案2】:

我是 python 新手,在安装 python 时遇到了问题。我在我的 Mac 上安装了来自 homebrew 和 anaconda 的 python。我的 anaconda 安装弄乱了我对 vim 和 MacVim 的自制 python 依赖项。

我的解决方案是每当我通过自制软件安装/更新软件包时,我都会从我的 PATH 中删除 anaconda。这有点痛苦,但我只是偶尔通过自制软件安装/更新软件包,所以没关系。

要在 python 2 和 3 之间切换,这是我在终端中的命令:

$ conda search python
...
...
$ conda install python=3.5.0

$ conda info -e
# conda environments:
#
py27                     /Users/apollotang/opt/local/anaconda2/envs/py27
py36                     /Users/apollotang/opt/local/anaconda2/envs/py36
root                  *  /Users/apollotang/opt/local/anaconda2

$ source activate py36      ### <——— here is the command in to change python version 
(py36) $ conda info -e
# conda environments:
#
py27                     /Users/apollotang/opt/local/anaconda2/envs/py27
py36                  *  /Users/apollotang/opt/local/anaconda2/envs/py36
root                     /Users/apollotang/opt/local/anaconda2

(py36) $ python -V
Python 3.6.2 :: Anaconda custom (x86_64)

我发现这个命令来自 How to change default Anaconda python environmenthttp://chris35wills.github.io/conda_python_version/

另外,这里有一篇关于在 mac 上设置 python 环境的最佳实践的非常好的文章 https://www.davidculley.com/installing-python-on-a-mac/

【讨论】:

    【解决方案3】:

    安装anaconda 意味着您不需要系统Python(将其留给系统,因为您可能不想更改它),或者homebrew 安装的Python。

    当您创建 conda 环境时,您可以指定您希望它使用的 Python 版本。例如:

    $ conda create --name myenv python=3.5
    

    激活conda 环境(在上述命令之后,您将使用conda activate myenvsource activate myenv 执行此操作,对于早期版本)自动意味着python 命令将运行您为该环境选择的Python 解释器.可以使用pipconda install 安装软件包,并且与conda 环境非常兼容。

    【讨论】:

      【解决方案4】:

      您可以设置一个虚拟环境 (virtualenv) 并为每个环境分配不同的 Python 版本,这样就不会有任何重叠导致依赖问题。

      查看“Python Hitchhiker 指南”了解如何完成设置。

      http://docs.python-guide.org/en/latest/dev/virtualenvs/

      【讨论】:

        【解决方案5】:

        如果使用 .bash,以下将在运行 brew 命令时暂时停用 anaconda 环境。 (见原zshpost

        第一步
        $ vim ~/.bash_profile
        

        --添加--

        if [ -f ~/.bashrc ]; then
            source ~/.bashrc
        fi
        
        第二步
        $ vim ~/.bashrc
        

        --添加--

        # Temporarily deactivates anaconda environment to run brew command(s)
        
        brew() {(
            local conda_env="$CONDA_DEFAULT_ENV"
            while [ "$CONDA_SHLVL" -gt 0  ]; do
                conda deactivate
            done
            command brew $@
            local brew_status=$?
            return "$brew_status"
        )}
        

        【讨论】:

          猜你喜欢
          • 2019-10-23
          • 2018-11-27
          • 2013-11-14
          • 2011-06-25
          • 2017-01-22
          • 2018-03-17
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多