如果在同一台机器上有多个环境在同时执行开发任务,这些环境往往存在版本差异性,例如环境1需要python2.7+Django1.1,环境2需要python3.6+Django2.2,这时候再来一个环境3需要python3.7+Django2.1就头大了。解决这种版本差异的最好方法就是利用虚拟环境相互隔离。这一篇我们就一起来对比下三种不同的虚拟方式然后重点看看专为python打造的虚拟环境virtualenv。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
三种虚拟方式
目前在一台机器上虚拟多个环境的方式有下面几种
- workstation为代表的虚拟机
这种方式可以完整虚拟出一整套的设备,从cpu到网口到操作系统,应有尽有。这种方式功能强大,但是占用资源也多,每次启动都得花好久。例如想在Windows中安装一套Linux环境来长期使用,可以考虑这种方法。 - docker为代表的容器
为了解决虚拟机庞大笨重的问题,容器技术应运而生。每个容器有自己的特定功能,例如Django的镜像可以生成一个Django容器,Redis镜像生成Redis容器。多个容器配合使用,组成一整套服务。容器的优点就是轻量,而且因为有镜像存在,不用担心容器挂掉的风险。 - virtualenv
有没有比容器更轻量的方式呢?有。virtualenv这种专门为python设计的虚拟环境,只能用于python开发,没有别的功能。为每个项目建立自己单独的根目录,初始化以后所有的第三方依赖包都是安装在自己项目的根目录下,不用担心不同项目互相干扰的问题。是python开发的首选。
安装virtualenv
virtualenv也是一个python第三方包,安装了python以后直接利用pip
命令安装即可
[fuhx@testmachine ~]$ pip install virtualenv
创建虚拟环境
直接运行virtualenv xxx
即可创建一个虚拟环境
[fuhx@testmachine python_projects]$ virtualenv test
created virtual environment CPython3.7.1.final.0-64 in 328ms
creator CPython3Posix(dest=/home/fuhx/python_projects/test, clear=False, global=False)
seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/home/fuhx/.local/share/virtualenv/seed-v1)
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
[fuhx@testmachine python_projects]$
virtualenv会创建一个与环境名字相同的文件夹,这个文件夹就是这个虚拟环境的根目录
[fuhx@testmachine python_projects]$ cd test
[fuhx@testmachine test]$ ll
total 4
drwxrwxr-x 2 fuhx fuhx 320 Feb 24 19:02 bin
drwxrwxr-x 3 fuhx fuhx 23 Feb 24 19:02 lib
-rw-rw-r-- 1 fuhx fuhx 264 Feb 24 19:02 pyvenv.cfg
[fuhx@testmachine test]$
和python相关的二进制文件,例如python
,pip
都在bin
目录下,和虚拟环境相关的操作命令也在bin
目录下
[fuhx@testmachine test]$ tree bin
bin
├── activate
├── activate.csh
├── activate.fish
├── activate.ps1
├── activate_this.py
├── activate.xsh
├── easy_install
├── easy_install3
├── easy_install-3.7
├── pip
├── pip3
├── pip-3.7
├── python -> /home/fuhx/anaconda3/bin/python
├── python3 -> python
├── python3.7 -> python
├── wheel
├── wheel3
└── wheel-3.7
0 directories, 18 files
[fuhx@testmachine test]$
等虚拟环境启动以后这个bin
目录会被加到PATH
变量的最前面,这样运行python和pip的时候就是从虚拟环境中运行了。
可以看出这里的python命令是本地机器的一个链接,这里是python3,如果我想在这个环境里面采用python2该怎么办呢?
在创建虚拟环境的时候利用-p
去指定python解释器,不过前提条件是本机已经安装了该解释器
[fuhx@testmachine python_projects]$ virtualenv -p /home/fuhx/anaconda2/bin/python test
启动虚拟环境
跑一下source bin/activate
即可启动虚拟环境,注意因为要在本shell中跑,只能用source
不能用sh
[fuhx@testmachine test]$ source bin/activate
(test) [fuhx@testmachine test]$
可以看到最前面有一个小括号,里面是虚拟环境的名字,这样就成功进入了虚拟环境。
我们来验证下
(test) [fuhx@testmachine test]$ which pip
~/python_projects/test/bin/pip
(test) [fuhx@testmachine test]$ which python
~/python_projects/test/bin/python
(test) [fuhx@testmachine test]$
可以看出已经从虚拟环境中运行python了。
如果我们检测下第三方包,发现没有任何第三方包
(test) [fuhx@testmachine test]$ pip freeze
(test) [fuhx@testmachine test]$
如果想把本机的已安装第三方包带入虚拟环境,可以在创建的时候加一个参数
[fuhx@testmachine python_projects]$ virtualenv --system-site-packages test1
这个时候再检查第三方包就和本机一样了
退出关闭虚拟环境
直接在虚拟环境中运行deactivate
退出虚拟环境,前面的小括号消失
(test) [fuhx@testmachine test]$ deactivate
[fuhx@testmachine test]$
如果要删除该虚拟环境,直接删除文件夹即可
[fuhx@testmachine test]$ cd ..
[fuhx@testmachine python_projects]$ rm -rf test
[fuhx@testmachine python_projects]$