How to use python effectively step by step
环境下载
先聊点别的
直接上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 | brew install miniconda |
如果你非常的不幸是Windows用户,那么可能需要折腾一会了,这里安装步骤就直接挂链接了,按照链接去安装下载配置即可。跳转链接:🔗(如果单击没用,就使用Ctrl+单击即可)
注意,建议软件安装在较大的盘中,一方面下载的依赖包一般会非常大,另一方面在运行依赖包时,通常会在对应的环境目录下产生大量缓存,因此下载时1G的依赖包可能在运行后会膨胀,从而导致存储占用变大。
怎么使用
验证是否下载成功
首先先验证conda是否下载成功,使用命令:
1 | conda -v |
如果出现版本号那么就是没问题的,如果是出现红彤彤的一连串字,或者出现“无法识别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 | no change xxxxxxxxx |
那么很好,你进入了连环坑,并且这个坑似乎目前为止只有Windows系统才有。
如何解决conda init的问题
为什么会遇到这个问题
这个问题是因为,在运行conda init后,在每次中断启动时都会运行conda init,而这种是有风险的。如果conda init是一个恶意脚本,每次运行终端时都会运行,那么系统显然就不安全了。为了避免这种情况,直接就禁止运行这个脚本了。
如何进行解决
作为运行者,我们知道这个指令运行的是什么,或者说我们就是要强制系统运行。怎么办呢,这个时候就要修改权限了。首先先提升权限,使用管理员身份打开powershel l(否则权限不够无法运行下面的指令),运行如下指令:
1 | get-ExecutionPolicy # 查看系统执行策略状态 |
然后你会看到下图所示的内容,按照下图一样输入Y即可:
这个时候再运行
1 | conda init |
就正常了,然后关闭终端重新打开。
如何使用conda创建环境
在经过上述的操作后,一般来说就能正常显示(base)前缀了。但是base环境一般安装的不是你想要的环境,需要重新创建新的环境,那么怎么操作呢?很简单,使用如下指令
1 | conda create -n 你想要取的名字 |
然后出现([Y]/n)的地方都直接回车,或者输入Y再回车即可。
当然这样创建出来的环境中是没有python的,怎么创建有python的环境呢,那么运行下面的指令
1 | conda create -n 你想取的名字 python=想下载的版本 |
进入创建的环境
创建环境后,需要进入指定环境,使用如下指令即可
1 | conda activate 环境名 |
如果你忘了环境名怎么办,使用如下指令可以列出现有的所有环境的名字以及路径
1 | conda env list |
刚刚创建环境的时候忘记下载python了,现在该怎么办呢?先进入对应环境,然后运行下面的指令
1 | conda install python=指定版本 |
下载依赖包
下载依赖包,和上面下载python是完全一样的,直接运行:
1 | conda install 依赖包名=指定版本 |
当然并不是所有的依赖包都可以使用conda进行安装,不过推荐使用conda,因为conda会自动检测包依赖问题并进行对应的版本升级或降级。(这个问题在后面经常会遇到,比方说下载的包A需要依赖包C,下载的包B也需要依赖包C,环境中可能也存在依赖包C,但是A所需要的依赖包C必须是某个指定版本,B要的是另一个版本,而现在的环境中是第三个版本,这种时候就非常头疼,而conda一般会自动解决,下面提到的pip就比较困难。)
对于一些包,并不能使用conda下载,如pytorch等,那么就需要使用pip了。但注意,pip是在下载python时下载下来的,所以如果你的环境中还没有python就无法使用pip指令。pip指令下载包也很简单,如下所示:
1 | pip install 包名=包版本 |
注意,其实下载包的时候,并不都需要指定版本,完全可以使用下面的指令
1 | pip install 包名 |
在pip安装的时候,一般不会有询问界面;而conda安装包的时候,会有询问是否安装的行为,也是([Y]/n)这种,直接回车或者输入Y后回车即可。
但是在真正下载时,常常会发现,根据时间提示,一个包似乎要下载好几天,如果多几个包的话,可能不到一个G的东西需要下一个月。如果真的很天真的去等待,会发现事实上下载了一会儿就自己断掉了。那么恭喜你,又进了一个坑。
如何换源
为什么会出现上述现象,很简单,因为conda/pip的源在国外,服务器在国外,如果没有一些网络工具,要访问国外的服务器速度会非常非常慢。这个时候该怎么办呢?
其实解决方案在前面下载anaconda时就给出了,直接进行换源,将conda使用清华源、中科大源等镜像站即可。常见的国内源有:
1 | 清华镜像anaconda源: |
以添加清华源为例,输入以下指令:
1 | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ |
而移除源的指令如下:
1 | # 要移除的单个源 |
当然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 | xxxxx=2.1 |
对于包特别多的,显然不会自己一行一行命令去敲,这太低效了。有没有什么简单的方法呢?
有的,兄弟有的:
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时,熟练使用各种命令,熟练配置环境,是非常重要的一环。


