Anaconda 学习整理

写在开篇,本文内容基于Windows平台,仅供日常使用参考,若您希望进行系统化的Anaconda学习请移步官方文档

如果您机器的环境已经紊乱,建议:

  • 对本机上各版本的python、Anaconda进行一次完全卸载;推荐采用强力的卸载工具Geek。在geek中搜索python和Anaconda,右键卸载即可。geek下载链接在这里:https://geekuninstaller.com/

  • 仔细检查环境变量中 用户变量系统变量中的path变量,将其中所有包含“python”、“anaconda”的变量全部删除。

    完成后,确保在命令提示窗执行python、pip及conda均是未找到命令。

  • 重启计算机后,开始按照如下指导进行环境的重新搭建工作。

1. Anaconda安装

Anaconda Individual Edition is a Python/R data science distribution and a collection of over 7,500+ open-source packages, which includes a package and environment manager.

Anaconda(个人版)是一个 python/R的数据科学发行版本,它涵盖了超过7500个开源包,其中包括了包管理器和环境管理器。

通常情况下,在windows上我们单独安装Anaconda即可,无需通过官源额外安装python。最佳策略是仅仅安装包含最常用python版本的Anaconda,其余版本python使用环境管理。

注意:Anaconda包含的解释器只是针对base环境下而言的,虚拟环境不受限制。换言之,包含python3.7的Anaconda也可以创建python3.9的虚拟环境~

出于一定考量,我选择了包含python3.7解释器的Anaconda3-5.3.0。各版本的Anaconda安装包我们可以在国内源站找到,笔者用了清华镜像站。也可以在官方下载列表中找到Anaconda-python对应关系及历史版本下载。

下载好后进行安装,注意如下几点:

  • 安装位置尽量选在有一定空间(不小于30G保留空间)的磁盘中(不太建议在C盘,因为windows系统中Conda的base环境以及默认新建环境都是在安装目录下存放);安装目录中最好不要出现中文以及空格。
  • 勾选将Anaconda加入环境变量、注册Anaconda为默认的python解释环境。

等待安装完成后,我们可以在命令窗口中输入如下命令进行相关性安装结果检测。

python --version       #检测python是否加入环境变量 
conda -V       #检测conda是否正常   

此处额外介绍一个检查conda中是否安装某包的命令:

conda list 包名$

例如:

conda list Spyder$
conda list jupyter$

不指定包名将列出当前conda的全部包。

2.Conda环境管理

这里笔者希望能谈一谈为什么我们要使用anaconda。大多数情况下,似乎电脑上的python-base环境加一个pip几乎能解决所有问题;但对于面向机器学习、大数据方向的开发及科研人员而言,他们往往会面对复杂的包环境,多个项目对同一个包的版本要求可能存在很大差异(特别是一些图形处理类的包),一个包的失配带来一个项目瘫痪的连锁反应并不是玩笑之谈。另一方面,我们可能有使用多版本python的需求,如果在一台电脑安装多个解释器,有可能引入一些混乱因素,破坏已有环境。

因此,我们建议用户养成环境管理的良好习惯。而Anaconda恰好提供了这一功能,你尽可能地为每一个项目都建立独立的环境(当然在熟悉以后你可以按照包的类型和版本建立属于自己的环境template),它可以是不同的python解释器环境,也可以是不同的包环境(不同版本、不同类型),且不同环境间各自互不干扰。

诚然,在开始使用多环境管理时,你会感到非常糟糕,特别是对于长期使用windows的用户而言(Linux多用户情形是天然的环境管理),但请坚信养成这样的习惯将会使你在从事复杂工作时受益匪浅,更有可能在未来某次任务中为你带来“救赎”,Anaconda不会辜负你。

2.0基础环境(base/root)

进入正文,我们打开命令提示窗,首先查看当前的conda 环境。默认情况下,您只有一个root环境,也就是我们最基础的python-base环境,在不激活其他环境的情况下,您的任何操作都将应用到该环境中。另外,您可以看到在环境名后有一个星号,星号指定了您当前处于哪一个环境中。

conda env list

此外,您也可以使用下述官方推荐命令查看环境:

conda info --envs

2.1创建环境

命令conda create可以创建环境。

2.1.1 指定环境名创建(最简方式)

我们来创建第一个环境,-n--name可以指定环境名,这里环境名(英文)尽量贴合项目内容或者主要包的版本。诸如(t1100k224 表示该环境中tensorflow是1.10.0 keras是2.2.4)。起名法则千万条,自己看懂第一条。 可能会提示您确认新增包,按y 回车即可。

conda create -n tk11 

创建好环境后,如果您可以通过conda env list看到您刚才创建的环境,我们通过以下命令激活环境。环境激活后,您可以看到命令提示符最左侧将出现(环境名),表示您当前的包操作及代码运行环境都将基于该环境。

2.1.2指定名字与py版本(最常用方式)

我们来创建一个包含3.7.0解释器的环境,这也是通常意义上最常用的方式。

conda create -n tk11 python=3.7.0

通常情况下,如果不指定pytohn的版本,将默认”克隆”一个base环境,指定后则是为您创建一个全新的基于该版本python的最简环境。

2.1.3 指定环境完整路径(最省空间方式)

我们可以使用-p--prefix指定环境存放的完整路径。笔者习惯在空间富足的盘中建立一个专用目录统一存放环境,以python版本\环境名作子目录规划。

下面命令将创建环境,并指定环境的存放目录是D:\AnaEnv\3.7\tk11,该环境没有“名字”,此后匹配该环境的操作(例如:激活、删除环境)都需要使用完整路径

conda create -p D:\AnaEnv\3.7\tk11   

特别注意:

  • 官方手册中提及This command requires either the -n NAME or -p PREFIX option.,即conda create必须指定-n环境名或-p存放位置,且二者不能同时存在
  • 二者差异:-n在Anaconda安装目录下的envs目录中创建与环境同名的目录,来存放该环境,匹配环境时用户使用环境名,Anaconda将在安装目录\envs\下匹配环境;而-p则是由用户指定环境的完整位置,匹配环境时用户需要指定完整的环境位置。
  • 疑惑:官方何不指定一种同时设置环境名和存放位置的命令模式?

2.1.4克隆本地环境

我们可以使用--clone来创建一个新环境,并且克隆某个本地环境的配置。该参后接环境名或环境完整路径。

conda create -n tk11Sub --clone D:\AnaEnv\3.7\tk11  
conda create -n tk11Sub --clone tk11   #等同于指定 安装目录\envs\tk11

2.1.5从文件中创建

如果您使用过pip install -r requirements.txt,那这一方式您应该较为熟悉。我们可以使用–file 来指定从他人共享的环境文件读取配置,创建环境。

conda create -n test --file env.yml

创建环境文件的方式也很简单,考虑到windows文件可读性建议您创建为yml(实际上后缀名随意):

conda env export > 环境文件名.yml

让我们来看下环境文件的简易版格式:

name: myConda #环境名
channels:   #镜像源 
  - defaults  
dependencies: #环境中安装的包
  - alabaster=0.7.12=pyhd3eb1b0_0  #通过conda安装的包
  - appdirs=1.4.4=pyhd3eb1b0_0
  ......
  - pip:          #通过pip安装的包
    - absl-py==1.0.0
    - aiohttp==3.8.1
    ......
prefix: C:\Anaconda\envs\myConda  #环境路径

熟悉格式之后,我们可以自己修改或编写对应的文件,也就是常说的环境模板(Environment Template)。

2.1.6指定包创建

结合官方手册,笔者将命令conda create归纳为携带两类参数:命名参数(Named Arguments)与位置参数(Positional Arguments)。

  • 命名参数,即需要指定名字的参数。诸如我们的-n -p,此处补充一个常识:-后跟的参数名是单字母简称--后跟的是长参名(或是完整参数名)。而有些参数名既有简称也有长参,就像-n --name-p --prefix

  • 位置参数只有一个 package_spec,即不需要名字的参数,但在位置上有要求,对于本条命令,您务必保证package_spec 连贯出现,我们建议您在命令末端使用该参数。本参数特指您在该环境新建时希望加入的包(还可指定包的等级,类比安装包),我们此前的python=3.7.0就是用例。下面将创建一个包含python3.6和reuquests的抓包环境:

    conda create -n catchPack python=3.6.1 requests

2.2 删除环境

目前conda并未提供环境删除的专用命令,我们多通过包删除命令来完成。

conda remove -n 环境名 --all

2.3 激活与退出环境

环境激活:

activate tk11                 #环境名
activate D:\AnaEnv\3.8\tk12   #完整路径

环境退出(在当前环境中):

deactivate           #退出当前环境 返回上一层

2.4 更多学习

我推荐您通过以下方式(同其他命令)进行conda的个性化学习:

  • 您可以使用 -h来便捷查看某命令的其他用法。
  • 您可以访问官方手册的Command Reference来更友好地学习conda。

3.Conda 包管理

3.0 pip与conda区别

介绍包管理,就绕不开官方包管理器pip与(强大)conda的区别,笔者结合查询所得,做了一些归纳搬用,如果您希望获得更原汁原味的讲解,强烈安利官方答疑

conda和pip尽管在功能上有重叠,但这两款工具是出于不同目的设计的。

  • pip是Python Packaging Authority (PyPA)团队推荐的用于从Python Package Index (PyPI)安装包的工具。
    • pip安装的是wheels文件或者源码形式的python软件包,安装源码包时需要配套的编译器(有的还需要一些库)辅助pip完成安装;通常在使用pip前我们需先安装python解释器。
    • pip没有内置环境管理,必须依赖virtualenvvenv等其他工具来创建隔离环境。 pipenv, poetryhatch等工具将pip和virtualenv封装起来提供了统一的包管理和环境管理功能。
    • pip以递归、串行循环的方式安装依赖项,无法确保所有包同时满足依赖,特别当前后安装的包存在版本不相容的依赖时,环境可能会被破坏。
  • conda是跨平台的包和环境管理器,可以安装和管理来自Anaconda repositoryAnaconda Cloud的conda包。
    • conda包是二进制文件,无需编译器支持,conda可以直接安装Python包以及Python解释器。conda安装包可能包含用其他语言编写的软件的包,包括但不限于C或C ++库,R包或其他软件。
    • conda能够创建可以包含不同版本的Python或其他软件包的隔离环境。
    • conda在安装包时采用了一个可满足性(SAT) 求解器来检查当前环境中安装的全部包的全部依赖是否能够满足,这一过程会耗费额外的时间,但能保护环境免遭破坏。
  • Anaconda则将pip和conda结合起来用以创建数据科学环境。主要原因是:有相当一部分包只在PyPI上分发,只能通过pip来安装。Anaconda仓库中涵盖1500多个软件包加上第三方Anaconda Cloud(主要是conda-forgebioconda)中提供的数千个软件包,相比于PyPI上 150,000多个软件包仍然是相形见绌。

更形象简洁的表述,笔者建议您移步官方答疑

3.1包安装

3.1.1 常规安装

conda install用来安装一系列包到指定环境中,多个包之间以空格间隔,可以只指定包名,也可以像bitarry=0.8一样同时指定包名和版本。

conda install keras tensorflow bitarry=0.8

3.1.2 本地安装

若您本地存在conda的二进制包,可以之间通过conda install安装,但这种安装不会检测依赖关系,也不应同常规方式混用在一条命令中。

conda install lxml-3.2.0-py27_0.tar.bz2

3.1.3 从文件中安装

类似于pip install -r requirements.txt,conda也提供从文件中读取包名和版本进行安装。文件格式与pip所用的requirements.txt相同。

conda install -f requirements.txt 

3.1.4 版本回退式安装

使得当前环境的包组回退到上一版本,详细请参照 2.3.4 包回退

conda install --rev  5

需要注意:

  • 安装包时,conda会安装指定包及其依赖依赖包,安装前会对所安装的全部包进行环境兼容性检测,无法通过兼容性检测时会报错,不会改变当前环境。
  • 在不指定包版本时,conda会试图安装最新版的包,为了匹配最新版软件包,conda可能会安装额外的包、甚至对已安装的包进行更新、升级。我们可以通过--freeze-installed参数来强制conda在不更新当前已安装包的情况下,选择稍旧的包进行安装。
  • 如果您觉得conda的依赖检测过于耗时,可以使用--no-deps跳过检测(不推荐)。

3.2 包卸载

在Anaconda中,无论用户处于何种环境下,只要通过conda install安装的包都会存放在Anaconda主目录的pkgs目录下。当某一环境中需要安装某包时,Anaconda会首先检查pkgs目录,若目录中已存在所需包,则可以直接将该包拷贝到新环境中。

上述拷贝的实际过程:将Anaconda\pkgs\包名\Lib\site-packages下的内容拷贝到Anaconda\envs\环境名\Lib\site-packages目录下。

3.2.1 从环境中删除

使用 conda remove来卸载环境中的一系列包,可使用-n 环境名-p 环境路径来指定环境,您也可以使用– all参数来卸载指定环境中的全部包,详见环境删除

conda remove -n tkEnv  numpy 

需要注意:

  • 卸载包时,conda remove只会删除该环境下的包,而不会影响pkgs目录下的包。若另一环境要安装该包,仍会优先从pkgs中拷贝。
  • 与安装相对应的,conda remove会从环境中删除指定包及依赖该包的全部包。换言之,删除包时请务必谨慎检查conda给出的删除列表,以免重要包被卸载。如果希望跳过依赖检测,只删除指定包,可以使用 --force,但会破坏当前环境(不推荐)。

[存疑:在base环境删除包会如何….]

3.2.2 从主机上删除

若要彻底从主机上删除某包,需要使用conda clean命令来清除Anaconda\pkgs中的内容。

3.3 包搜索

3.4 包更新

3.5 包回退


Anaconda 学习整理
http://example.com/posts/5e277129/
发布于
2022年3月2日
许可协议