python 虚拟环境原理_Python 虚拟环境

建议在开发环境和生产环境下都使用虚拟环境来管理项目的依赖。 - Flask

背景

Python 应用通常会使用一些第三方的软件包和模块。不同的应用可能会依赖不同版本的同一个软件包,或者依赖不同的 Python 版本。

设想这样的场景:

小白之前有一个 Flask 0.10 做的网站并且一直维护着。现在老板要求在同一个机器上使用最新版的 Flask 1.1 再做一个网站,两个网站以后都要用。这样,在机器上安装 Flask 0.10 或者 Flask 1.1 都会导致某一个网站无法运行。

为了解决类似这样的问题,虚拟环境上场了。

究竟什么是虚拟环境

每个虚拟环境都是一个独立于操作系统和其他虚拟环境的,被隔离的(isolated), Python 环境。

它拥有自己的 Python 二进制文件,并且拥有独立的已安装软件包集(site-package)。

正是因为每个虚拟环境的 Python 和 site-package 都是独立的,我们只要为每个项目配置自己的虚拟环境,然后就可以在项目各自的环境中安装各自依赖的软件包,而不用担心这些软件包和其他项目是否冲突了。

如何配置虚拟环境

开始配置之前,我们需要选择一个配置环境的工具包。

选择工具包

Python 配置虚拟环境的包有很多,最受好评的莫过于 virtualenv,甚至从 Python 3.3 开始,virtualenv 的一个功能子集被集成到了 Python 标准库的 venv 模块中。

virtualenv 和 venv 都是很好的选择,二者各有优劣。

virtualenv

venv

优势

1. 控制版本,可以将虚拟环境配置成不同于系统 Python 版本的其他版本

2. 创建 bootstrap 插件

3. 可重定位

4. Python 3.3 之前版本的首选

1. Python 3.3 以后内置于标准库

2. 浓缩了 virtualenv 的精华

劣势

1. 属于第三方库,使用前需要在系统中 pip install virtualenv

2. 功能冗余,小型项目用不太到很多功能

1. 不能将虚拟环境配置成不同于系统 Python 版本的其他版本

2. Python 3.3 之前版本无法使用

建议是,小型且对 Python 版本无特殊需求的项目,venv 足够了,其他情况用 virtualenv。

使用方法

venv

下为 linux/MacOS 示例,Windows 仅个别目录或文件名不同,原理一致,具体可参考官方文档。

假设项目的根目录为 /home/username/application/

进入项目根目录

$ cd /home/username/application/

复制代码创建虚拟环境

$ python3 -m venv 虚拟环境名

复制代码

例如,

$ python3 -m venv test-env

复制代码

这样在根目录中会出现一个 test-env 的目录,如下

application/

/test-env/

/bin/

/include/

/lib/

/share/

/lib64

/pyvenv.cfg

复制代码

这个 test-env 目录就是新创建的虚拟环境了。

进入虚拟环境

运行刚创建的虚拟环境目录中 /bin 中的 activate 即可

$ source /path/to/虚拟环境名/bin/activate

复制代码

$ source test-env/bin/activate

复制代码

$ . test-env/bin/activate

复制代码

这时,你会发现 Terminal 提示符多了个前缀 (test-env),括号中的内容代表当前的虚拟环境

(test-env) $

复制代码

可以通过 pip list 列出所有安装的软件包,会发现只有这俩

$ pip list

pip (9.0.1)

setuptools (39.0.1)

复制代码

当前状态下,cd 不会改变虚拟环境的状态,哪怕是出了项目根目录。

在虚拟环境中,就可以肆无忌惮的 pip install 了。

退出虚拟环境

输入 deactivate (或关闭 Terminal) 即可。这时再输入 pip list 又会显示系统环境所有安装的软件包了,而且提示符前面的 (test-env) 也没了。

(test-env) $ deactivate

$ pip list

Package Version

--------------------- -------------------

apturl 0.5.2

asn1crypto 0.24.0

Brlapi 0.6.6

certifi 2019.9.11

...

复制代码删除虚拟环境

只需将之前创建的 test-env 目录整体删掉就好了。

注意,删除虚拟环境会连同之前在虚拟环境中安装的所有软件包一起删除。

$ rm -r /path/to/虚拟环境名

复制代码

virtualenv

与 venv 大同小异,具体可参考官方文档。

假设项目的根目录为 /home/username/application/

安装

$ pip install virtualenv

复制代码进入项目根目录

$ cd /home/username/application/

复制代码创建虚拟环境

$ virtualenv 虚拟环境名

复制代码进入虚拟环境

$ source /path/to/虚拟环境名/bin/activate

复制代码退出虚拟环境

$ deactivate

复制代码删除虚拟环境

$ rm -r /path/to/虚拟环境名

复制代码

说个 Bug

如果你的系统是 Ubuntu ,那么,在虚拟环境中使用 pip list 或 pip freeze 时,会多处一项 pkg-resources (0.0.0) 或 pkg-resources==0.0.0。

看似是个不起眼的小 bug,但是,当用 pip freeze > requirements.txt 生成当前项目依赖时,如果不将 pkg-resources==0.0.0 这条删除,在下次使用 pip install -r requirements.txt 时,就会报错说找不到 pkg-resources==0.0.0 啥啥啥的。别问我是怎么知道这个细节的。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pullToRefresh下拉刷新上拉加载

PullToRefresh 是一个第三方的工程。 之前的自定义下拉刷新控件貌似不太好用,于是网上找了这个。 参考:http://www.cnblogs.com/summers/p/4343964.html 主要是一些功能都提供了接口,不需要自己再写了。 废话不多说,上干货。 1、布…

ArcGIS删除地图投影坐标,只保留地理坐标

今天突发奇想,在ArcGIS中进行投影转换很容易,那么如何删除投影坐标,只保留地理坐标呢? 一开始想着从投影文件(.prj)入手,删除其投影信息,结构不尽如人意。 如果从定义地理坐标(Define Projection)的角度入手,重新定义地理坐标,如WGS84呢?经过尝试之…

RHEL5U8配置Centos yum源

由于RHEL的yum在线更新是收费的,如果没有注册的话是不能使用的,即不能在线安装软件。在这种情况下,如果我们使用的机器安装的是RHEL系统要是每次安装软件先挂载本地光盘会很繁琐,而且有些软件也是老版本的,这种情况下我…

剑指offer之圆圈最后剩下的数

1 问题 求圆圈最后剩下的数,比如数组0, 1, 2 ,3 ,4围城一个环,我们每次去掉第三个数字,删除的前4个数字依次是2, 0, 4, 1,最后剩下的数字是3 04 13 2 2 思路 我们用list,我们要支持环就这样,如果发现当…

如何获取 Linq 查询结果集合中的索引?

咨询区 Guy我有下面一段伪代码:string[] s {"zero", "one", "two", "three", "four", "five"};var x s .Select((a,i) > new {Value a, Index i}) .Where(b > b.Value.StartsWith("t&…

AirTest 基本使用及框架浅剖析——五分钟上手制作游戏辅助

简介 Airtest Project 是为编写自动化脚本,达到提升测试效率的一整套解决方案。它可以轻松的扩展到多平台、多引擎上;如基础的 Android和IOS手机应用、App;Windows上的应用等。 学习使用 Airtest Project 很容易,由于 Airtest P…

计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...

3.2.1 数据传送指令1. MOVOPRD1,OPRD2MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。源操作数可以是累加器、寄存器、存贮器以及立即操作数,而目的操作数可以是累加器、寄存器和存贮器…

Chrome浏览器常见问题及解决方案集锦

Chrome是一款非常优秀的浏览器,尤其在网页调试方面出类拔萃,深得本人的喜欢。但是在使用的过程中,总有一些问题会困扰大家,现将一些常见问题及解决方案列举出来,供参考。 1. Chrome下遇到该网页已屏蔽插件adobe flash player的解决办法 适合以下情形: (1)确定在电…

Facebook用户遭遇千年虫:瞬间有了46年老友

一些Facebook用户今天碰到了一个有趣的bug,系统提示他们与好友有了46年长的好友关系。要知道,Facebook还不到15岁,很多用户也没有46岁的高龄。Facebook一直没有透露产生这个bug的原因,但它说已经意识到该问题。“我们已经确定了这…

ASP.Net 验证正则表达式

整数或者小数:^[0-9]\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$"。只能输入n位的数字:"^\d{n}$"。只能输入至少n位的数字:"^\d{n,}$"。只能输入m~n位的数字:。"^\d{m,n}$"只…

python123输出hello world_Python基础:输入与输出

输出print()函数:print()函数示例如下:>>>print(1)1>>> print(Hello World)Hello World>>> a 1>>> b a>>> print(a,b)1 a扩展部分:(初学不看)回过头来看print()函数的语法:print(…

(上)python3 selenium3 从框架实现代码学习selenium让你事半功倍

本文感谢以下文档或说明提供的参考。 Selenium-Python中文文档 Selenium Documentation Webdriver 参考 如有错误欢迎在评论区指出,作者将即时更改。 环境说明 操作系统:Windows7 SP1 64python 版本:3.7.7浏览器:谷歌浏览器浏览…

剑指offer之滑动窗口的最大值

1 问题 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值,列如,数组{2,3,4,2,6,2,5,1}的滑动窗口大小是3,一起6个滑动窗口,分别是{4,4,6,6&#…

.NET 7 中的 HostApplicationBuilder

.NET 7 Preview 3 引入的 HostApplicationBuilderIntro在 .NET 6 中,ASP.NET Core 引入了 Minimal API,对于简单的应用使用 Minimal API 我们可以使用非常精简的代码来实现我们的 API,在 .NET 7 Preview 3 中,引入了一个 HostAppl…

SQL Server 2008 R2 Developer Edition图文安装教程

本文主要以截图的方式,详细说明SQL Server 2008 R2 Developer Edition的安装过程。 1、双击安装包中的setup.exe,如下图,点击“安装”→“全新安装或现有安装添加功能”。 2、点击“确定”。 3、点击“下一步”。

计算机应用基础851,最新2020秋广东开放大学计算机应用基础本科上传资料作业2文档(2页)-原创力文档...

Sheet2sheet1姓名迟春艳宋灵辉任慧霞张玉鹏李卫东付祖荣焦中明杨丹妍张积盛王继锋王永隆陶春光刘炳光吕秀涛赵业绵齐晓鹏王晶晶张秀双姜殿琴车延波闫少林李安娜盖玉艳王建东于玲云周琳娜王瑞欣学生成绩表期中成绩期末成绩总成绩籍贯陕西江西河北山东湖南广东上海辽宁北京湖北山…

复利计算评价博客

评价: 201406114202 蔡彩虹(1) http://www.cnblogs.com/caicaihong/p/5393335.html 201406114207 甘佳萍(2) http://www.cnblogs.com/gjpg/p/5393501.html 201406114239 赖文亮(3) http://www.c…

地理模块化施工的优点_模块化建筑适合学校的6个原因

原标题:模块化建筑适合学校的6个原因我们正处于模块化建筑的新时代,学校建筑能从这种创新和有效的建筑方法中受益。最先进的工厂制造——减少制造时间; 提高施工质量; 更具环境可持续性; 减少现场工作和干扰学校的正常作息; 同时在项目期间提供更好的健康…

新款ATM恶意软件Alice 可对抗动态分析 但目前需要物理接触主机

趋势科技(Trend Micro)安全公司的研究人员警告称,新发现的恶意软件家族主要针对ATM机(自动取款机),唯一目的就是要掏空ATM机保险箱里的现金。 alice软件是什么 这款恶意软件被称为“Alice”,是迄…

(下)python3 selenium3 从框架实现代码学习selenium让你事半功倍

上一篇博文简要 在上一篇博文中已得知:使用 execute 向远程服务器发送请求会通过 webdriver 与浏览器交互,且发送已定义的命令常量可获得一些相关信息。 其中 execute 方法实现已经在上一篇博文中有实现说明。并且在我们已经知道 webdriver基类&#x…