• 题图由 Stable Diffusion 生成。
  • 本文旨在提供一个虚拟环境管理方式参考,所提供的虚拟环境管理方式经过作者测试,证实有效。
  • 网上这么多 Python 虚拟环境管理的文章或者教程,本文有何存在的必要:第一个原因是,网上提供的教程很多只提供了单一的虚拟环境管理工具,作者由于喜欢折腾,尝试过不同的工具,可以提供一些比较意见供参考。第二个原因是作者折腾过不同的系统,提供的经验适用于 Windows 10/11, Ubuntu 和 Windows Subsystem for Linux (WSL 2).
  • 本文不是很友好的新手教程,读者需要有一定的基础,文中使用的一些工具,如 Windows PowerShell 和 Bash,需要读者有一定的了解。
  • 本文按如下脉络进行,首先介绍为什么需要进行虚拟环境管理,然后介绍了作者使用过的几种虚拟环境管理实例,最后提供了一些延申参考。
  • 由于作者非计算机科班,文章内容只是自己的经验,所以不可避免带有作者的狭隘偏见。

引言:为什么需要进行虚拟环境管理

Python 开发环境管理分为两部分,一个是 Python 版本管理,一个是虚拟环境管理。

很多时候受限于我们的项目依赖,在开发不同的项目时需要用到不同的 Python 版本,例如 TensorFlow 2.10 就只能支持 3.7-3.10 的 Python 版本,但是最新版的 TensorFlow 就支持最新的 Python 3.11. 作者由于同时使用 TensorFlow 和 PyTorch 两个深度学习框架,就在电脑上安装了三个 Python 版本。

如果我们不使用虚拟环境管理的话,我们所有的包都会安装在系统全局 Python (Global Python, 也就是系统默认的 Python 版本) 的目录下,这会导致两个问题:

  • 第一个是由于在同一个目录下只能安装某一个包的一个版本,如果有两个项目对同一个依赖包有不同的版本需求,就会导致依赖冲突,给开发带来问题。
  • 第二个是,哪怕没有依赖冲突的问题,所有的依赖包安装在同一个目录下,会导致导出的依赖文件过于冗余,这在进行项目开源的时候是非常忌讳的(当然这个问题也存在简单的解决方法)。

基于上述两个原因,Python 开发环境管理的最佳实践是为不同的项目建立不同的虚拟环境。为了满足项目依赖对于 Python 版本的要求,我们在建立虚拟环境的时候,就需要指定 Python 版本,具体指定 Python 版本的方法会在下面的不同实践中具体介绍。

虚拟环境管理最佳实践(以 virtualenv 为例)

利用 Python 自带的 venv 管理虚拟环境

利用 Python 自带的 venv 管理虚拟环境有两个主要的问题:

  • 创建虚拟环境的时候无法指定 Python 的版本。
  • 使用 venv 的时候需要指定路径,比较麻烦。

基于上述两个原因,我很快就弃用了 venv。由于作者使用的时间太短,关于 venv 的介绍和详细使用,可以参考少数派站内的两篇文章。

  

关于 virtualenv,作者在查资料的时候发现二者同源,是 venv 的超集,所以对它也完全没有尝试。

利用 Miniconda/Anaconda 同时管理 Python 版本和虚拟环境

Miniconda 和 Anaconda 都打包了 Conda 这一包管理器,二者的区别在于,Miniconda 里面只包含了 Conda、Python 和一些必备的包,是最小的 Conda 安装环境;而 Anaconda 则提供了很多额外的数据科学或者机器学习的依赖包,例如安装完成之后就可以使用 Python 的IDE Spyder,导致其安装包非常臃肿。

由于 Anaconda 中的很多工具包我们都用不上,所以建议直接 Miniconda,遇到需要的依赖的时候直接安装即可。

由于 Windows 系统没有自带 Python 安装,所以如果直接安装 Miniconda / Anaconda,系统的默认 Python 版本就会是 Miniconda / Anaconda 的 Python 版本。

Windows

  • 下载并安装 Miniconda / Anaconda,只需要按照安装提示完成安装即可,安装过程中需要注意的是添加到系统环境变量中的这一步,建议将其添加到系统环境变量(Anaconda 官方安装教程)。
  • 创建虚拟环境
conda create -n venv_name python=3.11 # 创建虚拟环境并指定 Python 版本
conda activate venv_name # 激活虚拟环境
conda deactivate # 离开虚拟环境

Ubuntu/WSL

由于 Ubuntu/WSL 在 Terminal 里操作非常方便,流程和 Windows 中相同,只是以命令行的形式进行,故而提供完整的命令行参考。

sudo apt update && sudo apt upgrade
sudo apt install wget 
wget https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-x86_64.sh # 下载 Miniconda 安装文件
sh ./Miniconda3-py311_23.5.2-0-Linux-x86_64.sh # 安装 Miniconda,需要同意用户协议

conda create -n venv_name python=3.11 # 创建虚拟环境并指定 Python 版本
conda activate venv_name # 激活虚拟环境

利用 Pyenv 管理 Python 版本,Pipenv 管理虚拟环境

Windows

  • 通过 Windows PowerShell 安装 Pyenv,然后重启电脑
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"

pyenv --version # 查看 Pyenv 的版本
  • 利用 Pyenv 安装指定版本的 Python,设置默认版本 Python (Global Python)
pyenv install -l # 查看可以安装的 Python 列表
pyenv install 3.9.13
pyenv install 3.11.1
pyenv versions # 查看电脑中已安装 Python 版本

pyenv global 3.11.1 # 设置默认版本 Python
pyenv version # 查看默认版本 Python
  • 设置完 Global Python 后,需要将默认版本 Python 添加到系统环境变量中,否则在使用 Pipenv 时会报错:
C:\Users\*****\AppData\Roaming\Python\Python311\Scripts

# 如果不添加到环境变量,使用 Pipenv 时会报此错误
pipenv : 无法将“pipenv”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
  • 安装 Pipenv
pip install pipenv
  • Pipenv 创建虚拟环境
cd project_dir # 切换到项目文件夹
pipenv install --python 'C:\Users\*****\.pyenv\pyenv-win\versions\3.9.13\python39.exe’ # 创建虚拟环境,此时可以指定 Python 版本
pipenv shell # 启动虚拟环境
pipenv install package # 安装需要的包
exit # 离开虚拟环境

这里需要注意的是,虽然创建虚拟环境是在项目文件夹,但是不同项目的虚拟环境都在同一个目录下管理,不像  venv 会在项目文件夹下。

  • 常用命令
pipenv install package # 安装
pipenv uninstall package # 卸载
pipenv graph # 查看按照包的依赖关系
pipenv --venv # 查看虚拟环境执行文件路径 
pipenv --rm # 移除虚拟环境

Ubuntu/WSL

在 Ubuntu/WSL 中使用 Pyenv 和 Pipenv 的流程还是和 Windows 下相同,所以还是提供完整的命令行参考。

  • 首先安装 Pyenv
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
exec "$SHELL"
  • 利用 Pyenv 安装指定版本的 Python,设置默认版本 Python (Global Python)
# Installing libraries that need for installing Python
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
# Installing Python
pyenv install 3.9.13
pyenv install 3.11.1
pyenv versions # 查看电脑中已安装 Python 版本
pyenv global 3.11.1 # 设置默认版本 Python
pyenv version # 查看默认版本 Python
  • 安装 Pipenv
pip install pipenv # 使用 pip3 安装 pipenv
export PATH="/home/user/.local/bin:$PATH" # 添加路径到 PATH
echo "${PATH//:/$'\n'}" # show path one directory per line 
  • 利用 Pipenv 创建虚拟环境
cd project_dir
pipenv install --python 3.9 # 不用指定 Python 路径
pipenv shell # 启动虚拟环境
pipenv install package # 安装需要的包
exit # 离开虚拟环境

到这里可以总结一下,利用 Miniconda/Anaconda 管理开发环境和利用 Pyenv 和 Pipenv 管理开发环境的一个小小的区别:利用 Miniconda/Anaconda 建立虚拟环境的时候,我们指定的 Python 是在此时安装或者确认的,也就是一步到位;利用 Pipenv 建立虚拟环境的时候,我们是需要在已经安装了指定 Python 版本的基础上指定本地 Python 版本,基于此版本的 Python 来建立的虚拟环境,也就是分两步走

延申:IDE中使用虚拟环境

  • VS Code 中使用虚拟环境

Using Python Environments in Visual Studio Code

  • PyCharm 中使用虚拟环境

Configure a virtual environment | PyCharm Documentation (jetbrains.com)

  • 在 Neovim 中使用虚拟环境是作者计划中的下一篇文章。