zzxworld

使用 Python venv 虚拟环境

在使用 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

这样就可以像使用系统命令一样来使用当前项目下的 pippython 命令了。如果要解除这个模式可以使用如下命令:

deactivate

使用这种方式虽然可以像使用系统命令一样来使用 Python 命令,但也带来了另外一个问题:你有可能不会注意到当前 pippython 命令是属于哪个位置,从而导致一些「混乱」的使用问题。在同时开发多个 Python 项目会更容易出现类似的问题。通过 which 命令可以确认相关命令的位置来确保不会发生类似的情况。

which python

网上也有一些进入目录时自动切换的 Shell 脚本,对我来说这些都太「重」了,我个人是直接通过设置 $PATH 环境变量来解决。我使用的是 zsh,所以在 .zshrc 文件中添加了这样一行配置:

export PATH=./.venv/bin:$PATH

这样只要当前所在的目录下有 .venv/bin 目录,就会自动使用这个目录下的相关命令。

删除虚拟环境

使用 venv 安装的软件都位于当前项目目录,所以要只需要删除 venv 目录就可以了。这就是我说的能保持系统环境整洁的原因。