虚拟环境及venv和virtualenv的区别说明


Posted in Python onFebruary 05, 2021

一、虚拟环境概述

Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。

这说明一个Python安装可能无法满足每个应用程序的要求。例如:应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,则需求存在冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。

这个问题的解决方案是创建一个虚拟环境,一个目录树,其中安装有特定Python版本,以及其他包。

不同的应用将可以使用不同的虚拟环境。就可以解决需求相冲突的例子。

二、创建激活虚拟环境

用于创建和管理虚拟环境的模块称为venv。venv通常会安装你可用的最新版本的 Python。若系统上有多个版本的Python,可以通过运行 python3 或您想要的任何版本来指定Python版本。

1、创建虚拟环境

如项目名叫tutorial,创建对应的文件夹然后切换到根目录:cd tutorial。

如果使用venv,使用命令:$ python -m venv tutorial-env

其中tutorial-env是虚拟环境的名字,也作为创建的虚拟环境文件夹名称,可以自由修改。如果tutorial-env目录不存在,它将为你创建一个,并在其中创建包含Python解释器,标准库和各种支持文件的副本的目录。

注意:需要tutorial-env的虚拟环境文件夹名称加入 .gitignore文件以便让Git忽略。

虚拟环境的常用目录位置是 .venv。这个名称通常会令该目录在你的终端中保持隐藏,从而避免需要对所在目录进行额外解释的一般名称。它还能防止与某些工具所支持的 .env 环境变量定义文件发生冲突。

如果使用virtualenv,则使用下面的命令:$ virtualenv snow-venv

2、激活虚拟环境

通过执行对应的激活脚本来激活虚拟环境,不同操作系统的激活命令(激活脚本及路径)有一点不同。

Windows(CMD.exe):$ tutorial-env\Scripts\activate.bat

Linux和macOS(bash/zsh):$ source tutorial-env/bin/activate

activate.bat这个脚本是为bash shell编写的。如果你使用csh或fish shell,你应该改用activate.csh 或activate.fish脚本。

激活虚拟环境以后,命令行提示符前会显示当前虚拟环境的名字,并修改环境以使python命令所运行的将是已安装的特定Python版本。

退出虚拟环境:deactivate

三、venv模块和virtualenv工具

virtualenv:Python虚拟环境管理工具。

venv:Python标准库内置的虚拟环境管理工具,Python 3.3加入,Python 3.5开始作为管理虚拟环境的推荐工具,用法类似virtualenv,唯一不同的是创建虚拟环境的方式。

Python 2.x时,创建虚拟环境需要安装第三方的virtualenv,但Python 3.3之后,标准库里内置了venv模块,可以用来创建虚拟环境。

如果你使用Python 3.3及以上版本,推荐使用标准库内置的venv 模块替代virtualenv。

如果你使用Python 2,就只能选择virtualenv,你需要额外安装它。pip install virtualenv

补充:【python虚拟环境】virtualenv和venv不一样吗

在开发python应用程序的时候,系统安装的python3只有一个版本:3.4。所有的第三方的包都回被pip安装到python3的site-packages目录下。

如果我们要要同时开发多个应用程序,那这些应用都共用一个python,就是安装在系统的python3。如果应用A需要jinja 2.7,而应用B需要jinja 2.6怎么办?

这种情况下,每个应用需要各自拥有一套“独立”的python运行环境。有两个常用工具用于创建python“独立”环境:

venv is available by default in Python 3.3 and later, and installs pip and setuptools into created virtual environments in Python 3.4 and later.

virtualenv needs to be installed separately, but supports Python 2.7+ and Python 3.3+, and pip, setuptools and wheel are always installed into created virtual environments by default (regardless of Python version).

virtualenv

virtualenv就是用来为一个应用创建一套“隔离”的python运行环境。

首先,我们用pip安装virtualenv

pip3 install virtualenv

然后,假定我们要开发一个新的项目,需要一套独立的python运行环境,可以这么做:

在项目目录下,创建一个独立的python运行环境,命名为 venv

virtualenv --no-site-packages venv

命令 virtualenv就可以创建一个独立的python运行环境,我们还加上了参数 --no-site-packages,这样,已经安装到系统python环境中的所有第三方包都不会复制过来,这样,我们就得到了一个不带任何第三方包的“干净”的pyhton运行环境。

新建的python环境被放到项目录下的venv目录,有了 venv 这个python环境,就可以用source进入该环境:

source ./venv/bin/activate

或者是

source ./venv/Scripts/activate

注意查看activate命令被放在了哪个目录下。

执行上面的命令后,可以看懂命令指示符变了,有个 (venv) 前缀,表示当前环境是一个名为 venv 的python环境,下面可以正常安装各种第三方包,并运行python命令。

在 venv 环境下,用 pip 安装的包都在安装到了 venv 这个环境下,系统python环境不受任何影响,也就是说, venv环境是专门针对当前项目创建的。

退出 venv 环境,使用 deactivate 命令:

deactivate

这样就回到了正常的环境。

viratualenv是如何创建“独立”的python运行环境呢?其实就是把系统python复制一份到virtualenv的环境,用命令 source 进入一个virutalenv环境时,virtualenv会修改相关环节变量,让命令python和pip均指向当前的virtualenv环境。

venv

venv不用安装,不过需要python3.3以上。创建一个独立的python运行环境,命名为venv

python3 -m venv ./venv

上面的命令会在当前目录下创建一个名为venv的python环境中。进入和退出该环境的方式和virtualenv一致。

参考文档:官方文档

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
基于Python的接口测试框架实例
Nov 04 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
浅析Python四种数据类型
Sep 26 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
Python参数类型以及常见的坑详解
Jul 08 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
Apr 17 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 #Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 #Python
pycharm配置python 设置pip安装源为豆瓣源
Feb 05 #Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 #Python
python实现录制全屏和选择区域录屏功能
Feb 05 #Python
pycharm 使用anaconda为默认环境的操作
Feb 05 #Python
通用的Django注册功能模块实现方法
Feb 05 #Python
You might like
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
php使用qr生成二维码的示例分享
2014/01/20 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
怎样写好自我鉴定
2013/12/04 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
目标责任书范文
2014/04/14 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
公司文体活动总结
2015/05/07 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
代码解析React中setState同步和异步问题
2021/06/03 Javascript
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
Python实现8种常用抽样方法
2021/06/27 Python
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers