动机
在我对MacOS进行更新之后,我的TensorFlow不能用了。整了半天,感觉自己把电脑整得很乱了,于是我想到了备受夸赞的Anaconda。
安装与卸载
我是在MacOS Sierra 10.12.2下进行安装的,装的是Miniconda2,毕竟Mac硬盘不大是中所周知的……。
我们可以参照官网的《User Guide:Installation》进行安装,安装过程比较简单,先是下载一个installer(实际上就是一个.sh文件),然后bash这个文件,接着按照提示一步步走就行了。至于卸载,也在这个网页里面,直接rm -rf就行。
初探
既然装了,那就要上手用用,首先输入:
conda list
这将显示在conda中安装的所有的包。
然后我们输入:
$ python --version
输出不是“Python 2.7.14”这样的,后面竟然还加了一串“Anaconda”字样:
当我们直接输入python时,也是直接进入了Anaconda的掌控范围之中:
这个时候我就在想,那我怎么回到系统自带的Python Shell中呢?要回答这个问题,我们首先得搞清楚,Anaconda是如何对我们的Python实施“绑架”的。回忆安装时的步骤,发现其中有一步是是往我们的~/.bash_profile中加入下面的语句:
这样一来,我们就明白为什么输入python会直接进入到Anaconda Python中了:因为我们在输入命令时,Linux会去查找PATH变量里面记录的路径,而上面这个语句将miniconda2/bin放在了原有的python路径之前,因此输入python的时候,将会优先执行Anaconda Python。
搞清楚了这个问题,我们就得到了问题“如何在Linux系统自带的Python与Anaconda之间切换”的解决方案,即注释掉上面的语句,然后重新打开一个Terminal。但有时候我们又会觉得这样做很麻烦,那怎么办?只能给他们“一 Py 一 个”名字了。
打开~/.bash_profile文件,并加入:
alias py="/usr/bin/python2.7"
alias pyana="/home/gewei/Miniconda/miniconda2/bin/python2.7"
输入pyana进行测试:
输入py进行测试:
恩,我们成功了。值得注意的是,如果我们输入python,那么仍然选择的是Anaconda Python,这是由PATH中的顺序决定的。在上面的步骤中可能有人会问,为什么不是加入到~/.bashrc中呢?
这个问题涉及到了MacOS与Linux的不同。Unix中,只有当Shell是Login Shell的时候,.bash_profile才会被加载,而.bashrc则是Non-Login Shell就会加载。在Linux中,当用户登录到一个图形界面,然后打开一个终端Terminal,这时Shell是Non-Login Shell;而在OS X登录时,或者说我们打开一个Terminal的时候,其实是打开的Login Shell。所以这里我们直接在~/.bash_profile中进行修改。关于MacOs打开一个Shell是Login Shell这个事情,我们可以验证一下:
可见我没有乱说话,哈哈~
使用
在Shell中输入conda info:
这些信息能够让我们对于conda有一个大致的了解。比如说我们知道Anaconda集包管理功能和环境管理功能于一身,这就可以在上面得以体现,“channel URLs”、“activate environment”。此外,我们需要知道的是,Anaconda是一个用于科学计算的Python发行版,它与一般Python发行版的区别是多了一些管理的功能,并集成了一些科学计算库。
最后,我们列出一些常用的conda指令:
conda create -n [name] #创建名为name的conda环境,如tensorflow
source activate [name] #激活我们创建的环境,命令完成后,发现命令行之前多了刚创建的环境的名字
source deactivate [name] #退出名为name的环境,回到系统默认环境
conda remove -n [name] --all #删除刚刚创建的conda环境
conda info -envs #查看所安装的环境的列表,创建的环境都在`~/anaconda2/envs/`目录下面
conda list #查看已经安装的包
conda install [PACKAGENAME] #安装具体的包,加-n [name]可以安装到指定环境
conda list -n [name] #name环境下安装了哪些包
conda update -n [name] [PACKAGENAME] #升级name环境的名为PACKAGENAME的包
conda remove -n [name] [PACKAGENAME] #删除name环境的名为PACKAGENAME的包
有一点大家需要注意一下,假如我们想要将某个包,比如说scikit-learn,安装到环境Env1中,如果我们仅仅是激活了Env1,然后输入conda install scikit-learn,那么这时候scikit-learn将被安装到默认的base环境下,所以我们要加上-n Env1。换句话说,conda指令本身是默认绑定在base环境下的。
不过这会引出一个问题:“为什么我在某个环境Env1下,使用pip install是直接将包安装到了这个Env1中呢?”因为我们source activate某个环境其实就是将这个环境的路径(比如envs/tensorflow)加到了PATH最前面,所以当我们在Env1下执行pip install的时候使用的是envs/Env1/bin文件夹下的pip,因此就装到Env1中咯。
恩,希望我会在使用Anaconda的路上越走越远~