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
这种安装方法),要想安装它,必须得安装包含它的应用,官方有两种:Anaconda
和Miniconda
。它俩的不同在于: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的环境)。
鉴于此,此处可以给出另外一个安装渠道:通过Miniforge
安装conda
。
此处我们可以先搞清楚什么是conda-forge
,conda
也是一个包管理器,软件包存放的位置就是软件仓库,但除了官方维护的仓库外还有社区主导管理的仓库,conda-forge
就是这样一个社区管理的软件仓库。安装软件时可以通过conda install -c
来指定软件的下载渠道,目前有些软件包在官方仓库中是没有的,必须要从conda-forge
渠道下载安装,例如fastapi
。conda-forge
组织也提供了一个安装程序:Miniforge
,它与Miniconda
类似,但默认做了一些配置,比如它默认的软件下载渠道是conda-forge
。
但Miniforge
也有一个问题,就是它针对M1芯片的包是实验性的,未做充分的测试。
至此,我觉得倒不用过分纠结了,因为目前并不是每一个Python小版本都支持M1芯片,所以,我们在使用conda
时也无法避免在某些环境中没有原生支持M1的Python版本。所以,既然这样,那不如就用官方的,所以,我以下是记录的M1芯片MacBook上安装Miniconda
的过程。
- 首先,从官方下载安装脚本
- 进入下载到本地的安装脚本所在的目录
- 执行安装:
sh Miniconda3-latest-MacOSX-arm64.sh
,基本就是Enter
、yes
等等
- 重新打开一个新的终端窗口,执行`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
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
创建的环境的话,可以按下图所示进行操作:
参考文档: