Python这门语言是不保证向下兼容的,也就是说旧版本的库、函数可能在新版本中无法使用,这种机制的利弊都是显而易见的。利是Python每次新版本的技术革新都无需背负沉重的历史包袱,可以放开手脚去干,但带来的弊端就是:Python版本和第三方库、环境等的管理极为麻烦,比如使用Python处理数据分析需要Python3.9以及与3.9配套的相关库,而使用Python进行深度学习却又需要Python3.8以及与3.8配套的相关库。那这是不是意味着我们需要装n个版本的Python以及n多个类库呢?其实大可不必,我们有conda

关于conda是什么?官网中是这样解释的:“操作系统无关的系统级二进制软件包和环境管理器。”

通俗点讲,conda就是一个软件包,装在你的计算机上后就可以使用conda命令来新建一个或多个Python环境了,并且在不同的环境里可以安装不同的Python版本、类库等。

conda有不同的安装方法,但是没有只安装conda的方法(比如:没有brew install conda这种安装方法),要想安装它,必须得安装包含它的应用,官方有两种:AnacondaMiniconda。它俩的不同在于:Anaconda安装conda、Python、以及众多科学计算相关的库,比较占空间,而Miniconda正如其名,仅包含conda、Python及依赖的相关库,体积较小。所以,基于此,我们就可以选择适合自己的版本了,如果科学计算用的多,那装Anaconda,很多库可以开箱即用,而如果没有此类需求,那可以装Miniconda,以后用到什么库再装什么库即可。

但是有个问题:目前暂无支持苹果M1芯片的Anaconda,所以M1芯片的MacBook只能安装X86架构的然后再通过Rosetta转译来使用,这就没有必要,第一没有性能上的优势,第二,本身环境相关的东西就要以稳定为主,让Rosetta转译介入进来只会增加日后排错时的成本,因为我们无法知道是程序真的有问题,还是因为转译导致的问题。好在Miniconda目前已支持M1芯片,但截止到今天(2022-03-06)其最新的版本中Python仍然只有3.8(Python的最新版本已经到了3.10了,Anaconda最新版本中Python版本为3.9,但其实影响不大,它只代表base环境的Python版本,即使我们用了Miniconda,我们仍可以创建3.9的环境)。

image-20220306134115964

鉴于此,此处可以给出另外一个安装渠道:通过Miniforge安装conda

此处我们可以先搞清楚什么是conda-forgeconda也是一个包管理器,软件包存放的位置就是软件仓库,但除了官方维护的仓库外还有社区主导管理的仓库,conda-forge就是这样一个社区管理的软件仓库。安装软件时可以通过conda install -c来指定软件的下载渠道,目前有些软件包在官方仓库中是没有的,必须要从conda-forge渠道下载安装,例如fastapiconda-forge组织也提供了一个安装程序:Miniforge,它与Miniconda类似,但默认做了一些配置,比如它默认的软件下载渠道是conda-forge

Miniforge也有一个问题,就是它针对M1芯片的包是实验性的,未做充分的测试。

image-20220306140857528

至此,我觉得倒不用过分纠结了,因为目前并不是每一个Python小版本都支持M1芯片,所以,我们在使用conda时也无法避免在某些环境中没有原生支持M1的Python版本。所以,既然这样,那不如就用官方的,所以,我以下是记录的M1芯片MacBook上安装Miniconda的过程。

  1. 首先,从官方下载安装脚本
  2. 进入下载到本地的安装脚本所在的目录
  3. 执行安装:sh Miniconda3-latest-MacOSX-arm64.sh,基本就是Enteryes等等
  4. 重新打开一个新的终端窗口,执行`conda -V就会发现当前已安装成功

安装成功后,可以设置清华大学的镜像站:

1
2
3
4
5
# 设置清华大学的仓库镜像(注意:越往后增加的渠道,其优先级越高)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

可以使用命令创建一个新的环境:

1
conda create --name py39 python=3.9

查看所有环境:

1
conda info -e

切换环境:

1
2
conda activate 环境名
# 例如:conda activate py39

安装软件包:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
conda install fastapi
# 执行上述命令后会输出如下内容:
## Package Plan ##

  environment location: /Users/hongmao/miniconda3/envs/py39

  added / updated specs:
    - fastapi


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    anyio-3.5.0                |   py39hca03da5_0         162 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    fastapi-0.75.0             |     pyhd8ed1ab_0          44 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    idna-3.3                   |     pyhd3eb1b0_0          49 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    pydantic-1.9.0             |   py39h1a28f6b_0         1.8 MB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    sniffio-1.2.0              |   py39hca03da5_1          15 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    starlette-0.17.1           |     pyhd8ed1ab_0          44 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    typing-extensions-3.10.0.2 |       hd3eb1b0_0          12 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    typing_extensions-3.10.0.2 |     pyh06a4308_0          31 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    ------------------------------------------------------------
                                           Total:         2.1 MB

The following NEW packages will be INSTALLED:

  anyio              anaconda/pkgs/main/osx-arm64::anyio-3.5.0-py39hca03da5_0
  fastapi            anaconda/cloud/conda-forge/noarch::fastapi-0.75.0-pyhd8ed1ab_0
  idna               anaconda/pkgs/main/noarch::idna-3.3-pyhd3eb1b0_0
  pydantic           anaconda/pkgs/main/osx-arm64::pydantic-1.9.0-py39h1a28f6b_0
  sniffio            anaconda/pkgs/main/osx-arm64::sniffio-1.2.0-py39hca03da5_1
  starlette          anaconda/cloud/conda-forge/noarch::starlette-0.17.1-pyhd8ed1ab_0
  typing-extensions  anaconda/pkgs/main/noarch::typing-extensions-3.10.0.2-hd3eb1b0_0
  typing_extensions  anaconda/pkgs/main/noarch::typing_extensions-3.10.0.2-pyh06a4308_0


Proceed ([y]/n)?

# 此处因为我们已经设置了conda-forge的镜像了,所以无需再安装fastapi时指定下载渠道。
# 另外,可以看到,在安装fastapi时,会自动安装其相关的依赖,每一个依赖项都是按照下载渠道的优先级逐级查找并下载的。

我使用了oh_my_zsh,在安装了conda后进入终端会在命令行上方展示当前环境,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
(base)
# hongmao @ hongmaodeMacBook-Air in ~ [20:04:37]
$ python -V
Python 3.8.11
(base)
# hongmao @ hongmaodeMacBook-Air in ~ [20:04:40]
$ conda activate py39
(py39)
# hongmao @ hongmaodeMacBook-Air in ~ [20:04:48]
$ python -V
Python 3.9.7
(py39)
# hongmao @ hongmaodeMacBook-Air in ~ [20:04:51]
$ conda deactivate
(base)
# hongmao @ hongmaodeMacBook-Air in ~ [20:05:00]
$ conda deactivate

# hongmao @ hongmaodeMacBook-Air in ~ [20:05:08]
$

可以看到,上方每次有那个当前conda环境信息,有点烦人,这一点可以通过在base环境下执行conda deactivate来解决,但这仅是在当前终端解决,等你打开一个新的终端窗口会发现又出现了(base)

如果你不想总是开启base环境,则可以通过命令来设置默认开启或关闭:

1
2
3
4
# 设置默认关闭自动启用base环境
conda config --set auto_activate_base false
# 设置默认开启自动启用base环境
conda config --set auto_activate_base true

如果设置了默认不开启base环境,当你需要使用特定环境时可以使用conda activate 环境即可,或者使用conda activate命令来启动base环境。

使用这种方式的弊端就是终端的默认Python环境又变成了默认的2.x版本了。如果既想启动conda中的Python环境,又不想一直在终端看到那个环境信息,官网也给出了解决方案的:在.condarc文件中添加一行:changeps1: False。这样做就看似两样都得到了,但是conda本身相当一部分工作是做环境管理的,如果我们有较多环境的话,这样就无法快速的知道当前启用的是哪个环境了。如果你想默认打开终端时进入某些特定的环境,可以通过将auto_activate_base置为false,然后在你的.zshrc.bashrc文件中添加一行启动特定环境的命令:conda activate py39,这样每次打开终端时就可以进入py39这个环境了。

更多关于conda的使用,可以参考:conda常用命令

如果需要在PyCharm中使用conda创建的环境的话,可以按下图所示进行操作:

image-20220306151835755

参考文档: