最近配置了两轮pytorch环境,由于要频繁用到各种conda和pip命令,所以再此整理一下。
文章目录
前言:conda虚拟环境总结与解读
Conda和pip的理解
区别和联系
conda和pip都是用来管理包的,但是conda管理的范围大,不仅限于python,且其依赖检查更强大,还可以方便地创建虚拟环境。而pip专精于python,有一些conda没有的包在pip里能找到,而且pip有时候还有一些wheel(已经编译好的包),安装速度更快。
总之,conda和pip都可以用来管理python包,而且他们的包安装路径是一样的,但本身是两个软件,两套配置,两套命令。
建议优先conda,如果conda没有再用pip补充。
命令格式
linux命令格式如下:
command [options] [arguments]
其中option字段有-
和--
两种。
- 用于短选项,可以组合使用,适合快速输入;
-- 用于长选项,不可组合使用,适合明确表达选项的含义
注:[]方括号只是为了分割,实际输入中并不存在
conda里面也继承了这个特点,如下:
conda -V
conda --version
conda命令由 [主命令] [子命令] [选项1] [参数1]···组成,举个例子:
conda config --add channels [新源]
config就是子命令,--add channels为选项,新源为参数
conda环境命令
查看
显示所有环境:conda env list
创建和删除
创建环境:conda create -n [env] python=[python版本]
删除环境写法1:conda env remove -n [env]
删除环境写法2:conda remove -n [env] --all
注意,remove本来是用来删除包的,但是在显式指定环境命并且加了--all之后,就可以进行环境删除操作了。
导出与导入
导出:conda env export > [file.yaml]
导入:conda env create -f [file.yaml]
注意,导入比直接创建多一个env子命令
激活和退出
激活:conda activate [env]
退出:conda deactivate
包管理命令
安装和删除
conda install [package][==version] [-c] [channel]
pip install [package][==version] [-i] [index-url]
注意,-c和-i是指定临时源,而指定版本的==也可以换成>=,<=,这种写法兼容性更强一些。
conda remove [-n] [env] [package]
pip uninstall [package]
非标准:conda uninstall [package]
注意,pip本身没有虚拟环境功能,所以不需要指定env,而conda要指定。如果conda不指定env,则默认当前环境,也就是我们最常见到的命令。此外,conda uninstall是一种过渡式命令,并不标准。
文件批量操作
导出所有包:pip freeze > [requerement.txt]
安装所有包:pip install -r [requerement.txt]
上述pip操作类似于前面说过的conda环境的导出和导入
导出:conda env export > [file.yaml]
导入:conda env create -f [file.yaml]
二者的区别是conda更好用:
-
conda是一整个环境
- 如果你查看yaml文件,你会发现里面有 包名、源、依赖、本地路径
- 有人说conda导出环境不包含pip安装包,至少现在并非如此,conda会单独列出来一个pip项,里面的子列表列出pip的内容,并且在conda env create -f操作的时候调用pip命令进行安装
-
pip只是所有包的集合,没有环境信息
- 如果包来自于本地或者conda,就会在后面附带本地路径信息,此时在另一台电脑上安装的时候就会出现问题。
所以前面所谓的"conda导出环境不含pip包",其实是不准确的,实际上pip和conda导出的包信息都是包含其他来源的。只不过pip比较笨,比较原始,无法识别是本地还是conda来源,所以统一视作来自于本地,只要是在另一台电脑上安装就必然报错,只能用于本地备份(freeze很形象)。而conda因为是为虚拟环境而生,所以更加智能,来源于pip的会标出,并且在conda env create时会调用pip进行安装,甚至还会给你带上镜像源地址,真的是无痛安装。
当然还有一种特殊情况,就是pip,conda,本地安装三者交叉,这样的环境是很难操作的,最好还是整个导出为文件,虽然很大,但是至少不会出错。
换源相关
镜像源的概念和使用
conda install numpy
这个命令的背后,是你的conda先到默认源(https://repo.anaconda.com/pkgs/main/
)下进行查找,如果有对应包,就给你下载下来。如果没有,就切换下一顺位的源,以此类推。
所以源是什么呢?是一个代表文件夹路径的URL,而国内访问国外官网很不稳定,所以最好配置国内的镜像源。
需要注意,国内镜像源是有一定延迟的,不一定会有,但实际生产中大部分包都是有的,如果出错更大概率是你不会用镜像源,从网上粘贴了一个源就以为粘对了。目前来说,中科大源已停更,推荐使用清华源,当然还有阿里源,北师大源等可用,接下来展示清华源的使用方法:
一般我们最常用的就是conda(anaconda)和pip(pypi),你点进去之后就可以看到对应目录,复制好进行添加即可。
查看源
conda config --show channels
pip config list
在install中临时指定源
- conda用-c,即channel
- pip用-i,即index-url
注意,conda源有时候不一定是URL形式,比如-c conda-forge;-c pytorch,这些都不是conda默认源,但用的很多,所以就约定俗成为一个标识符,背后还是URL,
通过命令永久换源
conda:
Bash
conda config --add channels [channel]
conda config --remove channels [channel]
删除所有非默认:conda config --remove-key channels
pip:
Bash
pip config set global.index-url [index-url]
pip config unset global.index-url
需要注意的是,conda是可以用命令单独添加和删除源的,但是pip不可以,global下面只有一个index-url,代表唯一默认源,所以其命令也是set而不是add
pip似乎可以使用add global.extra-index-url 来添加,但是实测下来没有add子命令,所以我认为pip如果要使用多个源还是得修改文件,实在不行就手动-i吧,反正pip用的也少。
通过文件永久换源
我推荐用命令换源,文件涉及到优先级,而且格式也不一定对,所以这篇仅供参考。
源信息储存在配置文件中,默认情况下配置文件是不存在的,因为没必要,直接写在程序代码里就可以。如果你这个时候要添加,可以手动创建,不用担心什么,而当你通过命令添加源后,配置信息就会写入配置文件,此时配置文件也会出现,你可以进行修改。
conda的配置文件在.condarc里,具体有三级,建议在用户级别进行配置:
- conda:
env_dir/.condarc
- 用户:
~/.condarc
- 系统:略
一个奇怪的现象是,按理说conda优先级高于用户,但是我进行conda配置的时候,写入的是用户级别的condarc,比较诡异。
具体写法是:
Bash
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
- conda-forge
- https://repo.anaconda.com/pkgs/main
- https://repo.anaconda.com/pkgs/r
- https://repo.anaconda.com/pkgs/msys2
pip的配置文件位置看情况,linux叫pip.conf
,windows叫pip.ini
:
格式为:
额外源格式为:
Bash
[global]
extra-index-url = https://pypi.tuna.tsinghua.edu.cn/simple
代理模式下的SSL证书错误
在实际应用中,我发现开着代理(就算是直连模式),访问https源的时候就会出现链接失败的问题,这篇文章中提到了解决方法:
最简单的就是配置镜像源+把代理关了,就这么简单(doge)
其他
查看版本(pip同理):
conda -V
conda --version