python虚拟环境介绍
生产环境下的服务器中,可能同时运行多个项目。这些项目或许依赖不同版本的软件包。比如,A 项目依赖 django 1.11.9 版本,而 B 项目使用的是 django 2.0.1 版本。
但是要知道,同一个解释器中,是不可能存在同一个应用的不同版本的。后安装的版本会覆盖掉之前安装的版本。
这样会造成开发的混乱。
这时,我们就可以用到 Python 的虚拟环境了。
Python 的虚拟环境其实就是基于一个编译安装的 Python 3 解释器环境,分身出 N 多个 Python 3 解释器:
基于同一个 Python 3 解释器,创建多个 venv 虚拟环境。一个项目用一个虚拟环境,解决模块依赖冲突,很给力。
安装 virtualenv 虚拟环境任务
接下来,我们将要在一台 Linux 机器上:
启动 django1.11.9 项目,用 venv1 管理
再启动一个 django2.0.1 项目,用 venv2 管理
虚拟环境创建流程
了解一下,Python 解释器目录下的一个模块文件夹,所有模块都放在这里:
1 | /s26linux/python362/lib/python3.6/site-packages |
在物理解释器环境下,安装 virualenv:
1
[root@localhost ~]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
通过命令创建虚拟环境,且是一个没有任何模块的,纯净的 Python 3 解释器:
1
2
3[root@localhost ~]# mkdir /opt/venvs
[root@localhost ~]# cd /opt/venvs/
[root@localhost venvs]# virtualenv --no-site-packages --python=python3 venv1命令解释:
--no-site-packages
,用来创建干净没有模块的虚拟环境,这个是默认的,而且最新版本的 virtualenv 已经没有了这个参数,指定了反而会报错--python=python3
,指定以 Python 3 创建虚拟环境- 最后的
venv1
是虚拟环境的名字,是一个相对路径,也可以写成绝对路径的形式 - venv1 虚拟环境将被安装 django 1.11.9 项目
查看 venv1 文件夹,我们可以看到装有 Python 3 和 pip 3 的可执行文件的 bin 目录。通过命令发现没有多余的第三方包:
1
2
3
4
5
6
7
8
9[root@localhost venvs]# ls ./venv1/bin/
activate activate.fish activate_this.py easy_install pip pip3.6 python3 python-config
activate.csh activate.ps1 activate.xsh easy_install-3.6 pip3 python python3.6 wheel
(venv1) [root@localhost venvs]# pip3 list
Package Version
---------- -------
pip 20.0.2
setuptools 45.2.0
wheel 0.34.2创建好 venv1 后,我们再创建一个 venv2 虚拟环境,用于安装 django 2.0.1:
1
[root@localhost venvs]# virtualenv --no-site-packages --python=python3 /opt/venvs/venv2
使用命令激活虚拟环境:
1
2[root@localhost venvs]
(venv1) [root@localhost venvs]前面出现了提示符
(venv1)
,说明进入到虚拟环境中。检查虚拟环境是否正常:
1
2
3
4(venv1) [root@localhost venvs]# which python3
/opt/venvs/venv1/bin/python3
(venv1) [root@localhost venvs]# which pip3
/opt/venvs/venv1/bin/pip3Python 3 和 pip 3 均位于虚拟环境目录下,说明环境运行正常。
可以用命令退出虚拟环境:
1
2(venv1) [root@localhost venvs]# deactivate
[root@localhost venvs]#退出虚拟环境后,系统会自动删除 venv1 的环境变量。
venv1 虚拟环境的配置
开始试验,先激活 venv1,安装 django 1.11.9,创建项目,运行 hello,返回字符串“我是来自于venv1虚拟环境下的django1.11.9”
。
具体的配置流程为:
激活虚拟环境 venv1:
1
2[root@localhost venvs]# source ./venv1/bin/activate
(venv1) [root@localhost venvs]#安装 django 1.11.9:
1
(venv1) [root@localhost venvs]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.9
创建 django 项目,编写 hello 视图函数:
1
(venv1) [root@localhost venvs]# django-admin startproject dj1
修改 settings.py 的 ALLOWED_HOSTS 配置为:
1
ALLOWED_HOSTS = ["*"]
编写 MTV
访问 venv1 下的 django 1.11.9 项目成功:
venv2 虚拟环境的配置
激活第二个 venv2 虚拟环境,运行另一套 django 2.0.1 项目。
具体流程为:
退出 venv1,激活 venv2:
1
2
3(venv1) [root@localhost venvs]# deactivate
[root@localhost venvs]# source ./venv2/bin/activate
(venv2) [root@localhost venvs]#检查模块是否干净:
1
2
3
4
5
6(venv2) [root@localhost venvs]# pip3 list
Package Version
---------- -------
pip 20.0.2
setuptools 45.2.0
wheel 0.34.2安装 django 2.0.1:
1
(venv2) [root@localhost venvs]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==2.0.1
创建django项目,编写MTV,运行页面,返回”我是来自于venv2的django2项目”。
浏览器访问 venv2 下的项目成功:
virtualenvwrapper 的安装和使用
virtualenv 的有一个不足之处在于,每次开启虚拟环境之前都要去虚拟环境所在目录下的 bin 目录下 source 一下 activate。这样一来,操作繁琐不说,还需要我们不得不记住每个虚拟环境所在的目录。可是如果虚拟环境高多了,很容易搞忘虚拟环境给放在哪里了。
一种可行的解决方案是,将所有的虚拟环境目录全都集中起来,例如就像前面例子中,都放在 /opt/venvs/
,并且针对不同的目录做不同的事。
另一种好的办法就是使用 virtualenvwrapper 管理你的虚拟环境(virtualenv)。其实就是统一管理虚拟环境的目录,并且省去了 source 的步骤。
配置 virtualenvwarapper 的流程为:
要使用 virtualenvwrapper,首先当然要安装它。使用 pip,安装很简单(virtualenvwrapper 依赖 wheel、pbr 和 virtualenv):
1
2
3pip3 install wheel -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install pbr -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install virtualenvwrapper -i https://pypi.tuna.tsinghua.edu.cn/simple对于 Windows 则要安装:
1
pip install virtualenvwrapper-win -i https://pypi.tuna.tsinghua.edu.cn/simple
Windows 系统默认的虚拟环境安装在
C:\Users\username\envs
目录下,如需指定,只需在环境变量中,设置 WORKON_HOME 变量。设置 Linux 的环境变量,确保计每次开机启动时加载 virtualenvwrapper。
打开并编辑
~/.bashrc
文件:1
vim ~/.bashrc
在文件末尾添加下面几行代码,注意修改 Python 解释器和 virtualenvwrapper 的地址为自己的 Python 安装位置,修改好后保存并退出:
1
2
3export WORKON_HOME=~/Envs # 设置virtualenv的统一管理目录,可按需修改
export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3 # 指定python解释器
source /opt/python36/bin/virtualenvwrapper.sh # 执行virtualenvwrapper安装脚本
读取 ~/.bashrc
文件,使其生效:
1 | source ~/.bashrc |
执行效果像下面这样,说明运行成功。不出意外的话,完成此步即可使用 virtalenvwrapper。
1 | [root@localhost ~]# source ~/.bashrc |
virtualenvwrapper 的基本使用操作命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# 创建一个虚拟环境:
mkvirtualenv my_django111 # 这会在 ~/Envs 中创建 my_django111 文件夹
# 在虚拟环境上工作,激活虚拟环境my_django111
workon my_django111
# 再创建一个新的虚拟环境
mkvirtualenv my_django2
# virtualenvwrapper 提供环境名字的tab补全功能。
# 当有很多环境, 并且很难记住它们的名字时,这就显得很有用。
# workon还可以任意停止你当前的环境,可以在多个虚拟环境中来回切换
workon django1.11
workon django2
# 也可以手动停止虚拟环境
deactivate
# 删除虚拟环境,需要先退出虚拟环境
rmvirtualenv my_django111其他常用命令:
1
2
3
4
5
6
7
8
9
10# 列举所有的环境
lsvirtualenv
# 导航到当前激活的虚拟环境的目录中,比如说这样就能够浏览它的 site-packages
cdvirtualenv
# 和上面的类似,但是是直接进入到 site-packages 目录中
cdsitepackages
# 显示 site-packages 目录中的内容
lssitepackages
# 完整官网介绍:https://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html