问题描述
在开发 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>
参考文献
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