「Python」- 同时运行多个不同版本:虚拟环境(学习笔记)

问题描述

在开发 Python 应用时,应用程序经常需要运行在不同版本的环境中安装不同版本的模块,但是这些模块是相互冲突的、无法共存的。比如,某些 Python 项目运行在 django 2.0 中,而某些 Python 项目运行在 django 3.1 中,我们无法在系统中同时安装两个版本的 django 模块。但是,这是常见需求,很多编程语言都需要面对类似的问题,那要怎么办呢?

在 Python 中,我们可以使用虚拟环境(Virtual Environments)来解决该问题。

该笔记将记录:在 Python 中,如何使用虚拟环境(Virtual Environments)来运行多个不同版本(且独立的)Python 环境,以解决多个项目需要不同版本 Python 环境的问题。

解决方案

虚拟环境(Virtual Environments)

在 Python 中,虚拟环境(Virtual Environments)就是该问题的解决方案。在创建虚拟环境后,相关操作将发生在该环境中(这里“相关操作”是指与 Python 环境有关的操作,比如 pip install 将会将模块安装到该虚拟环境中,而不会影响系统环境),使得单个项目的运行环境与其它项目独立起来。

如下步骤,搭建虚拟环境:

# 第一步、安装 virtualenv 模块
pip3 install virtualenv

# 第二步、创建虚拟环境
virtualenv --python=python3 "venv-example" # 执行该命令,将创建 ./venv-example 目录

# 第三步、激活虚拟环境
source venv-example/bin/activate # 执行该命令后,我们将进入虚拟环境

# 第四步、执行操作
# 与 Python 环境有关的所有操作将发生在该环境中
# 比如,模块安装将安装到 venv-example 下的对应目录中,并在使用时从中加载模块。

# 退出当前虚拟环境
deactivate

virtualenvwrapper – 管理虚拟环境

使用 virtualenv 存在的一个问题是:为了运行不同应用,我们需要为每个应用单独创建虚拟环境。但是,很多应用需要的虚拟环境是相同的,这些完全应用可以共享虚拟环境。因此,我们可以写个工具,用于创建多个虚拟环境,并且能够在这些虚拟执行快速切换。

所幸,现在已经有了这个工具,使用 virtualenvwrapper 工具,便可解决该问题。在安装该工具后,通过命令 mkvirtualenv 将在“共享目录”中创建虚拟环境,通过命令 workon 快速加载特定虚拟环境,当然还有其他功能。

安装并使用 virtualenvwrapper 工具:

pip3 install virtualenvwrapper

mkdir -pv ~/.virtualenv
echo 'export WORKON_HOME=~/.virtualenv'           >> ~/.bashrc # “共享目录”,用于保存要共享的虚拟环境(该目录必须存在)
echo 'source /usr/local/bin/virtualenvwrapper.sh' >> ~/.bashrc
source ~/.bashrc

如果使用 Ubuntu 发行版,能够直接安装:

apt-get install virtualenv virtualenvwrapper

# 然后,需要重新登录当前用户

使用方法以及常用操作:

# 创建虚拟环境
mkvirtualenv env1                # 将创 $WORKON_HOME/env1 虚拟环境
mkvirtualenv -p python3 env1     # 使用 Python 3 来创建虚拟环境

# 切换到虚拟环境
workon env1

# 查看已安装的虚拟环境
lssitepackages       
lssitepackages -b
lssitepackages -l

# 删除已安装的虚拟环境
rmvirtualenv         

常见问题处理

修改已有虚拟环境的 Python 版本

如果希望修改已有虚拟环境的 Python 版本,由很多方法:
1)通过 pip freeze 导出 requirements.txt 文件,然后 mkvirtualenv 重新创建;
2)通过 python -m venv –upgrade YOUR_VENV_DIRECTORY 进行升级;

Could not find platform independent libraries <prefix>

相关链接

python – What is the difference between venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc? – Stack Overflow

参考文献

Change Python Version in an Existing Virtualenv
How to Set Up Virtualenv with Virtualenvwrapper on Ubuntu 18.04
How to use Python virtualenv – PythonForBeginners.com
python 3.x – How do I remove/delete a virtualenv? – Stack Overflow
python – Can existing virtualenv be upgraded gracefully? – Stack Overflow
Python中的虚拟环境的使用
Python 虚拟环境
Python 虚拟环境 virtualenv
Using different versions of python with virtualenvwrapper – Stack Overflow
virtualenvwrapper 5.0.1.dev2 — virtualenvwrapper 5.0.1.dev2 documentation
virtualenvwrapper – List all virtualenv – Stack Overflow