缘起
在使用Python开发时,遇到了很多配置环境的情形。有时需要安装不同版本的Python,有时需要安装不同的Python包,有时需要安装不同的Python包的不同版本。
最开始使用时我基本上都是看网上的教程,不同的Python项目可能使用不同的环境管理工具,不知不觉就用过了pip
、conda
、mamba
、virtualenv
、venv
等等。这些工具各有优劣,有时候我也会混用,导致环境变量混乱,有时候还会出现冲突。
由于一直没有什么一致性,导致电脑上的Python环境比较乱,我自己也感觉云里雾里的,所以我打算总结一下这些工具的使用方法,以及它们的优缺点。最后会给出我自己推荐的一些使用方法。
Python管理工具分类
Python管理工具可以分为两类:
-
包管理工具:用于安装、卸载、更新Python包,如
pip
、conda
、mamba
等。 -
环境管理工具:用于管理Python环境,如
venv
、virtualenv
、conda
、mamba
等。
我们这里主要讨论环境管理工具,因为包管理工具的使用方法比较简单,而且大多数情况下我们都会使用pip
,所以这里不再赘述。
之前我也写过一篇关于Linux下使用module
管理软件包和环境变量的文章,可以参考“Linux下使用module管理软件包和环境变量”
环境管理工具
venv
venv
是Python自带的环境管理工具,其使用起来是最简单,也是最不需要操心的。
使用方法
-
创建一个新的环境:
1
python -m venv .venv
这样就会在当前目录下创建一个
.venv
的文件夹,里面包含了一个新的Python环境。当然,这里的.venv
可以替换成任何你想要的名字,用.venv
是因为这样可以创建一个自动隐藏的文件夹,在git中也很容易把它忽略掉。注意,这里的
python
是你想要创建环境的Python版本,如果你有多个Python版本,可以使用python3
或者python3.10
等。 -
激活这个环境:
如果是Linux系统或者MacOS系统,可以使用如下命令:
1
source .venv/bin/activate
如果是Windows系统,可以使用如下命令:
1
.venv\Scripts\activate
-
安装Python包:
在激活环境之后,使用
pip
安装Python包会把包安装到这个环境中,而不是全局环境。安装的包会放在.venv/lib/python3.10/site-packages
目录下。1
pip install numpy
-
退出环境:
在环境中使用
deactivate
命令可以退出环境。1
deactivate
优缺点
-
优点:
- 原生工具,简单易用,不需要安装额外的软件。
- 速度快,因为不需要下载额外的软件包。
- 环境隔离,不会影响全局环境。
- 可以在任何地方创建环境,不需要管理员权限。
- 每个项目中的环境都在本项目目录下,与其他项目做到了物理隔离,不易弄混。
-
缺点:
- 每个项目都需要创建一个新的环境,如果有很多项目,会占用很多空间。
- 无法共享环境,如果有多个项目使用同一个环境,需要重复创建。
- 不好切换Python版本,每个环境都是一个Python版本,无法切换。
- 只适用于Python 3.3及以上版本。
简单来说,如果你不在意空间占用,不需要切换Python版本,那么venv
是一个很好的选择。
virtualenv
由于venv
有很大的占用空间的问题,所以有人开发了virtualenv
,它是一个第三方的环境管理工具,可以解决venv
的一些问题。
virtualenv
的使用方法和venv
基本一样,只是需要安装virtualenv
这个包。
使用方法
-
安装
virtualenv
:1
pip install virtualenv
-
创建一个新的环境:
1
virtualenv .venv
如果你想指定Python版本,可以使用如下命令:
1
virtualenv -p python3.10 .venv
-
激活这个环境的方式和
venv
一样。 -
安装Python包的方式和
venv
一样。
但它和venv
的区别在于,virtualenv
会复用系统的Python库,不会重复安装,所以占用的空间会小很多。如果你不想复用系统的Python库,可以使用--no-site-packages
选项,在本项目中安装全新的Python库。
- 退出环境的方式和
venv
一样。
优缺点
-
优点:
- 可以指定Python版本。
- 可以共享环境,不需要重复创建。
- 占用空间小,不会重复安装Python库。
- 适用于Python 2.7及以上版本。
-
缺点:
- 非原生工具,需要安装额外的软件。
简单来说,如果你在意空间占用,且想要和venv
相似的使用体验,那么virtualenv
是一个很好的选择。
conda
conda
是一个非常强大的环境管理工具,它不仅可以管理Python环境,还可以管理其他语言的环境,如R、Julia等。
conda、Anaconda、miniconda、mamba、micromamba之间的关系
-
conda
是Anaconda的一部分,Anaconda是一个数据科学家常用的工具包,里面包含了很多数据科学家常用的软件包,如numpy
、pandas
、scipy
等。但有用户反映Anaconda安装的软件包太多,占用空间太大,所以有人开发了miniconda
,它是Anaconda的精简版,只包含了conda
和一些基本的软件包。 -
不管是Anaconda还是miniconda,都是使用
conda
这个包管理工具来管理环境,但conda
在安装软件包时是单线程的,速度比较慢,所以有人开发了mamba
,它是conda
的一个加速版,速度比conda
快很多。 -
mamba
和conda
的使用方法基本一样,只是在安装软件包时使用mamba
代替conda
。用户基本可以认为,mamba
命令是conda
命令的一个别名。 -
micromamba
是mamba
的一个精简版,micromamba
的base
环境是空的,不包含任何软件包。
conda的原理(也适用于mamba)
-
conda
环境管理工具会在用户的家目录下创建一个.conda
文件夹,里面包含了所有的环境,每个环境都是一个文件夹,里面包含了一个Python环境和一个软件包列表。 -
用户每创建一个新的环境,
conda
环境管理工具就会在.conda
文件夹下创建一个新的文件夹,里面包含了一个新的Python环境和一个新的软件包列表。用户每安装一个新的软件包,conda
包管理工具就会把这个软件包安装到对应的环境中。 -
用户每激活一个环境,
conda
环境管理工具就会把这个环境的Python环境和软件包列表添加到环境变量中,用户每退出一个环境,conda
环境管理工具就会把这个环境的Python环境和软件包列表从环境变量中删除。 -
创建好的
conda
环境跟某个项目无关,用户可以在任何地方激活这个环境,不需要在项目目录下创建环境。
使用方法(以mamba
为例)
-
安装
conda
或者mamba
:你可以在
miniforge
找到最小化的conda
或者mamba
安装包,下载安装即可。 -
创建一个新的环境:
1
mamba create -n myenv python=3.10
这里的
myenv
是环境的名字,python=3.10
是指定Python的版本。 -
激活这个环境:
1
mamaba activate myenv
-
安装Python包:
1
mamba install numpy
-
退出环境:
1
mamba deactivate
优缺点
-
优点:
- 可以指定Python版本。
- 可以共享环境,不需要重复创建。
- 可以安装其他语言的环境。
- 速度快,因为有
mamba
这个加速版。 - 可以在任何地方激活环境,不需要在项目目录下创建环境。
- 可以共享软件包,不需要重复下载。
-
缺点:
- 非原生工具,需要安装额外的软件。
- 环境跟具体项目是分离的,对于较久未使用的环境,可能会忘记这个环境是干什么的。对于较久未使用的项目,可能会忘记这个项目使用的是哪个环境。
简单来说,如果你想要一个强大的环境管理工具,而且想要安装包时速度快,那么conda
或者mamba
是一个很好的选择。但在开发某个项目时,最好标注一下这个项目使用的是哪个环境,以免忘记。
冻结环境
无论使用哪种环境管理工具,都可以使用pip freeze
命令来冻结环境,即把当前环境的软件包列表保存到一个文件中。
|
|
这样就会在当前目录下创建一个requirements.txt
文件,里面包含了当前环境的软件包列表。当你需要在另一个环境中安装这些软件包时,可以使用如下命令:
|
|
这样就会安装requirements.txt
文件中列出的所有软件包。
总结
- 如果你不在意空间占用,适用高于3.3版本的Python,不需要切换Python版本,只想要一个最简单的环境管理工具,那么
venv
是一个很好的选择。 - 如果你在意空间占用,想要共享环境,适用于2.7及以上版本的Python,那么
virtualenv
是一个很好的选择。 - 如果你想要一个强大的环境管理工具,想要安装包时速度快,那么
conda
或者mamba
是一个很好的选择。
推荐的使用方法
- 如果你不在于空间占用,且可能用到很多科学计算的包,在你的主力开发电脑上,可以安装
Anaconda
。 - 如果你在意空间占用,只想在需要时安装包,可以在你的主力开发电脑上安装
micromamba
。 - 如果你不在意空间占用,在你的测试电脑上,或者在你的服务器上,可以使用
venv
。