在使用 Python 开发程序时,默认会使用系统环境下安装的 Python 版本和软件包。这在碰到多个项目以及多个版本共存的情况下会出现一些冲突问题。Python venv(virtual environments) 可以让程序对 Python 环境的依赖局限到更小范围,是创建 Python 开发环境的利器。
即便是没有多项目和多版本的 Python 开发需求,如果和我一样对系统环境有「洁癖」,不想因为开发需求而弄乱了系统的默认 Python 环境,同样也可以使用 venv 来保持系统环境的「整洁」。
创建虚拟环境
使用 venv 创建虚拟环境的命令很简单,在安装好系统 Python 环境后,只需要项目根目录下使用下面的命令:
python -m venv .venv
命令执行完成后,在当前目录下可以看到多了个 .venv 目录。注意后面两个 venv
,第一个为 venv 的模块名称;第二个为项目级别的 Python 环境目录名称,可以自己随便定义。我在前面加了个「点前缀符号」,这是 Linux 系统下隐藏文件和目录的特殊格式,我这么做的目的是希望在日常使用中不用看到这个目录。
使用虚拟环境
在刚刚创建的 venv 目录中有个 bin 目录,里面有 python
以及 pip
命令。它们可以像使用系统下相同命令一样来执行。区别在于执行方式和安装软件的保存位置。举个例子,我要安装 Jieba 分词组件,需要这样来执行 pip
命令:
.venv/bin/pip install jieba
这个组件会被安装到当前项目的 .venv/lib/python3.10/site-packages/
目录下。所以要使用这个组件也只能通过这个 .venv 目录下的 python
命令来执行:
.venv/bin/python -m jieba
如果尝试使用 python -m jieba
命令,就会出现 ModuleNotFoundError: No module named 'jieba' 错误。
如果觉得每次都要在 pip
命令和 python
命令前添加 .venv/bin
目录名称有点繁琐。也可以尝试 .venv/bin/activate
环境激活命令:
source .venv/bin/activate
这样就可以像使用系统命令一样来使用当前项目下的 pip
和 python
命令了。如果要解除这个模式可以使用如下命令:
deactivate
使用这种方式虽然可以像使用系统命令一样来使用 Python 命令,但也带来了另外一个问题:你有可能不会注意到当前 pip
或 python
命令是属于哪个位置,从而导致一些「混乱」的使用问题。在同时开发多个 Python 项目会更容易出现类似的问题。通过 which
命令可以确认相关命令的位置来确保不会发生类似的情况。
which python
网上也有一些进入目录时自动切换的 Shell 脚本,对我来说这些都太「重」了,我个人是直接通过设置 $PATH
环境变量来解决。我使用的是 zsh,所以在 .zshrc
文件中添加了这样一行配置:
export PATH=./.venv/bin:$PATH
这样只要当前所在的目录下有 .venv/bin
目录,就会自动使用这个目录下的相关命令。
删除虚拟环境
使用 venv 安装的软件都位于当前项目目录,所以要只需要删除 venv 目录就可以了。这就是我说的能保持系统环境整洁的原因。