环境下载

先聊点别的

直接上python官网下载python使用确实是一种方法,但是这种仅适合单纯学习python语法等,并不适合真正项目开发,因为面对不同实验需要使用不同版本的python解释器,总不得每次使用版本不同就每次都从官网下载一个python吧?虽然有点烦,但是如果是服务器环境,那种没有桌面只有命令行的情况下怎么办呢?总不得各种curl指令然后使用一些奇技淫巧给下载下来吧。另外,真实开发中/跑实验时,如深度学习实验,不可能真的一个python的语法从头开始写,显然是需要下载各种依赖包,比方说pytorch等。这个时候又怎么搞呢?虽然pip一下似乎也可以,但是电脑环境会弄得非常乱。另外,如果不同版本的解释器同时都存在于电脑环境中,你如何确定运行你的项目时是需要的版本的解释器呢?

这个时候,就很需要一个重要的发明,用来隔离不同python版本的环境,同时也用来管理各种依赖包。幸运的是,这种软件早已被发明出来了,但是有太多软件,如miniconda,anaconda,uv,pip等等。如何进行选择呢?

既然是对于小白向学生向,那uv之类的就可以不考虑了,conda管理模式更适合。这里就讲一下miniconda和anaconda有什么区别:

  • Miniconda:更轻量的包管理器,没有预下载的软件、依赖包等,似乎是没有GUI界面
  • Anaconda:比较重量的软件,下载安装的同时会下载很多其它内容

如何下载

对于Linux用户,建议就直接使用miniconda吧,下载非常简单,以Ubuntu为例,直接在命令行运行以下指令等待时间即可:

1
sudo apt install miniconda

对于Mac用户,也很简单,类似的操作即可:

1
2
3
4
brew install miniconda

# 或者安装anaconda
brew install anaconda

如果你非常的不幸是Windows用户,那么可能需要折腾一会了,这里安装步骤就直接挂链接了,按照链接去安装下载配置即可。跳转链接:🔗(如果单击没用,就使用Ctrl+单击即可)

注意,建议软件安装在较大的盘中,一方面下载的依赖包一般会非常大,另一方面在运行依赖包时,通常会在对应的环境目录下产生大量缓存,因此下载时1G的依赖包可能在运行后会膨胀,从而导致存储占用变大。

怎么使用

验证是否下载成功

首先先验证conda是否下载成功,使用命令:

1
2
3
4
conda -v

# 或
conda --version

如果出现版本号那么就是没问题的,如果是出现红彤彤的一连串字,或者出现“无法识别conda”,或者有“conda不是内部或外部指令”,或者里面有“Error”等字样,那么恭喜你,开始了第一步踩坑。

如何解决第一步坑

首先,打开任务栏上的Windows图标,点击关机。然后重新打开电脑,也许就解决了。虽然说关机可以解决50%的问题,但这个关机其实是有依据的,极大可能是因为你配置完环境,系统还没将环境的目录加载到系统中。而每次开机时,系统开机时会重新读取各种环境的配置的文件进行重新加载,这个时候你配置的新的内容就会被加载到系统中,所以可以解决问题。

如果再次运行指令还是显示同样问题,那么这个坑属于之前环境没配好,大概率是添加错了文件路径,重新配一遍就行了。

开始使用conda

一般正常的情况下,现在打开终端,通常会有如下的显示:

1
(base)C:xxxxx> 

即前面会多一个前缀(base),这种是属于正确的情况。但是大概率,安装完后打开终端会发现没有这玩意,那么恭喜你,第二个坑你又踩中了。

如何解决自动加载conda环境的问题

这个没有显示(base)应该是属于没有自动加载base环境,其实也可以解决,怎么弄呢,按照网上的教程和博客,正常来说,会教你这么一条指令:

1
conda activate base

确实很正确,没有自动加载,那么我手动加载不就行了,然后你会发现怎么似乎输出和网上的教程不一样,有很多看不懂的输出,而且也没多出前缀,出现了一堆东西,里面有一个叫

1
conda init

然后你搜索博客,发现网上教你直接运行这个命令,缺出现了下面的一堆乱七八糟的输出,怎么又和网上不一样,what can i say!

1
2
3
4
no change			xxxxxxxxx
no change xxxxxxxxx
no change xxxxxxxxx
No action taken.

那么很好,你进入了连环坑,并且这个坑似乎目前为止只有Windows系统才有。

如何解决conda init的问题

为什么会遇到这个问题

这个问题是因为,在运行conda init后,在每次中断启动时都会运行conda init,而这种是有风险的。如果conda init是一个恶意脚本,每次运行终端时都会运行,那么系统显然就不安全了。为了避免这种情况,直接就禁止运行这个脚本了。

如何进行解决

作为运行者,我们知道这个指令运行的是什么,或者说我们就是要强制系统运行。怎么办呢,这个时候就要修改权限了。首先先提升权限,使用管理员身份打开powershel l(否则权限不够无法运行下面的指令),运行如下指令:

1
2
get-ExecutionPolicy   # 查看系统执行策略状态 
set-executionpolicy remotesigned # 修改执行策略状态

然后你会看到下图所示的内容,按照下图一样输入Y即可:

这个时候再运行

1
conda init

就正常了,然后关闭终端重新打开。

如何使用conda创建环境

在经过上述的操作后,一般来说就能正常显示(base)前缀了。但是base环境一般安装的不是你想要的环境,需要重新创建新的环境,那么怎么操作呢?很简单,使用如下指令

1
2
3
4
conda create -n 你想要取的名字

# 如:你想要取名test,就输入下面的指令
conda create -n test

然后出现([Y]/n)的地方都直接回车,或者输入Y再回车即可。

当然这样创建出来的环境中是没有python的,怎么创建有python的环境呢,那么运行下面的指令

1
2
3
4
5
conda create -n 你想取的名字 python=想下载的版本

# 如
conda create -n test python=3.9 # 会从3.9的版本中挑选一个子版本下载
conda create -n test python=3.9.2 # 下载的是3.9.2版本的python

进入创建的环境

创建环境后,需要进入指定环境,使用如下指令即可

1
2
3
4
conda activate 环境名

# 如
conda activate test

如果你忘了环境名怎么办,使用如下指令可以列出现有的所有环境的名字以及路径

1
conda env list

刚刚创建环境的时候忘记下载python了,现在该怎么办呢?先进入对应环境,然后运行下面的指令

1
2
3
4
conda install python=指定版本

# 如
conda install python=3.9

下载依赖包

下载依赖包,和上面下载python是完全一样的,直接运行:

1
2
3
4
conda install 依赖包名=指定版本

# 如
conda install numpy=1.21.4

当然并不是所有的依赖包都可以使用conda进行安装,不过推荐使用conda,因为conda会自动检测包依赖问题并进行对应的版本升级或降级。(这个问题在后面经常会遇到,比方说下载的包A需要依赖包C,下载的包B也需要依赖包C,环境中可能也存在依赖包C,但是A所需要的依赖包C必须是某个指定版本,B要的是另一个版本,而现在的环境中是第三个版本,这种时候就非常头疼,而conda一般会自动解决,下面提到的pip就比较困难。)

对于一些包,并不能使用conda下载,如pytorch等,那么就需要使用pip了。但注意,pip是在下载python时下载下来的,所以如果你的环境中还没有python就无法使用pip指令。pip指令下载包也很简单,如下所示:

1
2
3
4
pip install 包名=包版本

# 如
pip install torch=2.1

注意,其实下载包的时候,并不都需要指定版本,完全可以使用下面的指令

1
2
3
4
5
6
pip install 包名
conda install 包名

# 如
pip install torch
conda install numpy

在pip安装的时候,一般不会有询问界面;而conda安装包的时候,会有询问是否安装的行为,也是([Y]/n)这种,直接回车或者输入Y后回车即可。

但是在真正下载时,常常会发现,根据时间提示,一个包似乎要下载好几天,如果多几个包的话,可能不到一个G的东西需要下一个月。如果真的很天真的去等待,会发现事实上下载了一会儿就自己断掉了。那么恭喜你,又进了一个坑。

如何换源

为什么会出现上述现象,很简单,因为conda/pip的源在国外,服务器在国外,如果没有一些网络工具,要访问国外的服务器速度会非常非常慢。这个时候该怎么办呢?

其实解决方案在前面下载anaconda时就给出了,直接进行换源,将conda使用清华源、中科大源等镜像站即可。常见的国内源有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
清华镜像anaconda源:
channels:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ ssl_verify: true

上海交大anaconda镜像源:
channels:
https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main/
https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/free/
https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge/ ssl_verify: true

中科大anaconda镜像源
channels:
https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/ ssl_verify: true

以添加清华源为例,输入以下指令:

1
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

而移除源的指令如下:

1
2
3
4
# 要移除的单个源
conda config --remove channels 要移除的单个源
# 移除全部源
conda config --remove channels

当然pip下载也是同样的问题,需要进行换源。

如果是临时使用,即只在本次下载中换源,则使用下面的指令:

1
pip install 包名 -i https://mirrors.bfsu.edu.cn/pypi/web/simple --trusted-host mirrors.bfsu.edu.cn

如果是需要一直使用,那么以阿里云镜像为例,使用下面的指令:

1
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

根据文件下载依赖包

在运行别人源码的时候,为了保证环境一致,需要配置完全相同的环境,从python版本到包版本,才有可能运行成功。通常,作为学术规范和道德(划掉),一般都会有一个requirements.txt文件,这个文件中记录了各个包的版本,或者仅记录各个依赖包,文件格式大体如下:

1
2
3
4
5
6
7
8
9
10
xxxxx=2.1
xxxxx
xxxxx
xxxxx
xxxxx=1.5
xxxxx
xxxxx=3.4
xxxxx
xxxxx
············

对于包特别多的,显然不会自己一行一行命令去敲,这太低效了。有没有什么简单的方法呢?

有的,兄弟有的:

1
pip install -r requirements.txt

查看本环境中的依赖包版本

这个非常简单,直接运行

1
conda list

即可。

如果你都是使用pip安装的包,可以运行下面的指令

1
pip list

安装错依赖包版本了怎么办/如何卸载包

对于conda,重新conda install就行了,反正它自己会去解决版本冲突问题的。当然,别忘记在指令中加入你所需要的版本才会正确下载对应版本的包。

对于pip,有点麻烦,先要卸载再下载(也许也可以直接下载?没试过)

卸载包的指令如下:

1
pip uninstall 包名

conda卸载也同理

1
conda uninstall 包名

如何将环境中的依赖包名存储到文件

正如上文所说的,为了遵守道德(划掉),需要创建一个reqiurements.txt文件。一种偷懒的方法是自己创建文件,写一下主要的包名和版本,其它的让别人自己解决去。

另一种是采用指令,直接输出所有的包版本,使用如下指令:

1
pip freeze > requirements.txt

稍微来解释一下这个指令是什么意思,pip freeze可以获取到所有的包名和版本并输出到控制台,而>是将控制台的内容重定向到后面跟着的文件名中输出,这么一解释自然就知道为什么这条指令可以创建相应文件了。

当然两种方法不好说谁好谁坏,第一种方法漏掉很多包,让其他人配置的时候很麻烦,要一遍一遍运行程序,当报包缺失的时候再解决,很头疼。但第二种难道就好了吗?其实也不是,由于各机器硬件环境不同,操作系统不同,以及安装时通常没给出python版本,即使给了这么多包,但是指定了各个版本后,极大可能在下载时会出现大量依赖包版本冲突,并没有比第一种方法好多少。

如何删除环境

对于anaconda,打开Anaconda navigator软件,点击左侧的Environments按钮,选中你所要删除的环境,点击remove按钮即可。如下图:

对于conda删除环境,其实有对应的指令,但是笔者发现在anaconda中这个指令并不能彻底删除对应环境,因此不做介绍了,而且GUI界面更适合小白操作。

(防止不知道)如何查看当前环境中python版本

一种直接使用conda查看环境依赖包的指令,直接从中去找python字段,但太低效了。

直接

1
python --version

即可

写在最后

python相对而言是一个很简单很方便的编程语言,而对于python项目/实验,环境是及其重要的。在运行他人项目时,遇到环境配置配几个小时没配好是很正常的现象,两三天都配不出也是属于常见的事情了。因此,在学习python时,熟练使用各种命令,熟练配置环境,是非常重要的一环。