其实我很认同最高赞答案的说法,他先介绍了自己平时的需求,自己做数据处理,很少训练模型,会跑少量AI模型,对比之下virtualenv和pyenv是最适合他的方案。
这里我也补充下我的背景。我日常需要复现从2015年到2021年的顶会文章的工作,包括训练和推导,需要不同版本的cuda,python甚至是不同版本的gcc等。我总结出最后最适合我的方案是conda。
----
这个问题下面的很多回答,都搞混了conda和pip的关系。
比如我们今天要跑一个开源仓库,该仓库依赖了python2.7和torch0.4,而你又不想把你现在环境中的torch1.7降为torch0.4,毕竟只有这一个工程需要torch0.4。而且你的环境是python3.6,难道你要为了这个工程再去装个python2.7吗?此时,你可以执行如下操作
conda create -n py27 python=2.7 conda activate py27 pip install torch==0.4
等你执行完了这个程序,你想回到原来的python,只需要执行
conda deactivate
就会回到你之前的环境。你在py27这个环境里安装的一切包,不管是pip还是conda安装的,都不会影响你当前的环境。
另外,尽管conda和pip都提供了安装python包的功能,但两者的源并不重合。两者各自维护自己的源。conda源中包含了包含了很多非python的包,比如gcc,nodejs,cuda,都可以用conda来安装和管理。因此很多时候你没得选。比如有个工程需要torch0.4,而torch0.4依赖了cuda9.0。而你电脑里只有cuda11.0,你难道要再去网上下个cuda9.0吗?此时你只需要使用
conda install cudatoolkit=9.0
就解决了cuda版本问题,不香吗?pip是不会托管cudatoolkit这种包的,因此这时conda和pip配合使用就是最好的解决方案。
质疑浪费空间的,miniconda安装包也就50多M(里面带了一个python),比python安装包大不了多少,但能让你有机的组织起任意多个python环境来。为何不用呢?
当然,切换python版本的功能pyenv也可以实现。但pyenv+virtualenv的方案只能使用pip,无法提供一些只有conda托管的包,而这些包又是我经常要用的。因此我选择了conda。
2. virtualenv的环境是local的,也就是说activate文件是在当前目录的子目录下的,这个venv被设计为只为本工程服务。
当你不在这个目录下的时候,如果你想复用之前的环境,必须要记忆之前的venv的绝对路径,然后执行source <venv_path>/bin/activate
而conda创建的环境是全局的,也就是说你如果之前创建过虚拟环境,你可以在任意时刻任意位置执行conda activate py27
。有时候一些依赖类似的仓库,如果我们之前已经有类似的虚拟环境了,就不需要重新创建,直接激活之前的虚拟环境就好。
女王:求求题主放过我,我可不敢有什么政绩。。。