Anaconda和Brew的最佳实践

时间:2017-03-17 14:12:19

标签: python macos homebrew anaconda

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

我希望遵循最佳做法'这里提到:https://github.com/nicolashery/mac-dev-setup

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

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

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

5 个答案:

答案 0 :(得分:6)

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"
}

您想在运行conda之前停用brew,以使brew每次尝试安装某些软件时都不会在conda中找到PATH软件包。实际上,如您在运行brew之前未停用brew doctor一样,conda会抱怨,如我上面链接到的帖子所述。 (另请参见this question。)

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

此功能还可能在运行brew时产生一些不必要的开销,因为我相信您实际上只需要在运行conda时停用brew install环境。就是说,如果您是那种足够在意这笔开销的人,那么这个答案可能不会告诉您您不知道的任何事情。

最后一点,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[@]}。但是,我尚未对此进行测试,因此请在使用前测试它是否满足您的要求。

答案 1 :(得分:3)

我是python的新手,我的python安装遇到了麻烦。我在我的mac上安装了自制软件和anaconda的python。我的anaconda安装搞砸了我的自制python依赖vim和MacVim。

我的解决方案是每当我通过自制软件安装/更新软件包时,我会从我的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/

答案 2 :(得分:1)

安装anaconda意味着您不需要系统Python(将其留在系统中,因为您可能不想更改它)或homebrew安装的Python。< / p>

创建conda环境时,可以指定要使用的Python版本。例如:

$ conda create --name myenv python=3.5

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

答案 3 :(得分:1)

这是一篇有关自制和水蟒重叠以及处理方式的有趣文章。 setting up python environment with anaconda and homebrew

答案 4 :(得分:0)

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

查看“The Hitchhiker's Python指南”,了解如何进行设置。

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