Python 虚拟环境工作原理解析


Posted in Python onDecember 24, 2020

Python 的虚拟环境用来创建一个相对独立的执行环境,尤其是一些依赖的三方包,最常见的如不同项目依赖同一个但是不同版本的三方包,而且,在虚拟环境中的安装包不会影响到系统的安装包。

不过,其具体的工作原理是怎样的,这里详细介绍。

简介

几乎每个语言都包含自己的包管理工具,这是一个非常复杂的话题,而不同语言选择的实现又略有区别,都会做一些选择和取舍。而 Python 的包管理解决方案很多,例如 pip、virtualenv、pyenv 等等。

不过 Python 语言本身的机制决定了其原理一样。

使用

比较常用的是 virtualenv 工具,可以参考 Guide to Python 中的详细介绍,另外,Python3 也提供了自己的虚拟环境创建模块,在创建完成后基本都是通过一个脚本启用独立环境。

例如,如下是使用 virtualenv 以及 venv 的虚拟环境创建过程。

$ mkdir /tmp/project && cd /tmp/project

$ virtualenv --no-site-packages foobar
$ python3 -m venv foobar

然后,就可以通过 source foobar/bin/activate 命令激活新环境。

激活脚本

所谓的独立环境,无非就是解决两个问题:A) 执行 Python 解析器所使用的版本;B) 使用独立的包。其中前者,在 Linux 主要是通过 PATH 环境变量设置,在 activate 脚本中有如下的内容。

VIRTUAL_ENV="/tmp/project/foobar"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

也就是将创建的目录添加到 PATH 环境变量最开始,那么就会优先查找该路径,这样就解决了 python 解析器独立的问题。

工作原理

如果要使用独立的包,那么关键就是如何在通过 import 导入时查找到所需的包。

包的查找顺序可以查看Python 模块简介 中的介绍,简单来说,就是先查看是否是内置模块,然后再从 sys.path 列表指定的地址中搜索。所以,这里的关键就是 sys.path 列表的生成。

关于 sys.prefix

在 Python 启动的时候,会先加载一个强依赖的 os.py 包,而查找这个包是根据解析器的当前路径,以及固定的查找规则来实现的。

简单来说,就是在当前路径加上 lib/python${VERSION}/os.py 逐层向上查找,注意,如果是 64 位的操作系统,那么会使用 lib64 替换掉之前的 lib 路径。

例如,默认的 Python3 的解析器路径为 /usr/bin/python3.6 ,那么基础路径是 /usr/bin/ ,所以,其查找顺序为。

/usr/bin/lib64/python3.6/os.py
/usr/lib64/python3.6/os.py
/lib64/python3.6/os.py

只要在任意路径上找到 os.py 包,那么就会退出查找,并设置好 sys.prefix 变量,详细可以通过 strace python 查看,会有如下的搜索路径。

stat("/usr/bin/Modules/Setup", 0x7fffb7146300) = -1 ENOENT (No such file or directory)
stat("/usr/bin/lib64/python2.7/os.py", 0x7fffb71462f0) = -1 ENOENT (No such file or directory)
stat("/usr/bin/lib64/python2.7/os.pyc", 0x7fffb71462f0) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/python2.7/os.py", {st_mode=S_IFREG|0644, st_size=25910, ...}) = 0

在查找到 os.py 之后,会将该路径设置为 sys.prefix 变量,然后解析器就会到 ${sys.prefix}/lib/python${VERSION} 目录下查找包。

总结

那么其工作原理就是,将 python 解析器保存在 ${VENV_PATH}/bin/python ,然后创建 ${VENV_PATH}/lib/python${VERSION} 目录,并将相关的文件复制到该目录下,可以复制文件,也可以使用软连接。

其它

如上,如果是 Python3 就可以直接使用内置的 venv 模块,其原理与上述的相同,同时通过 pyvenv.cfg 配置文件来标识原始的 home 位置,该文件的内容如下。

home = /usr/bin
include-system-site-packages = false
version = 3.6.8

如果 include-system-site-packagestrue ,解释器启动时就会将系统的库添加到 sys.path 里面,这样在虚拟环境就可以 import 系统中安装的包了。

注意,Python3 提供的 venv 模块只能根据当前版本创建,不能支持 Python2 。

参考 Virtualenv 官方文档,细节可以参考该文档。

到此这篇关于Python 虚拟环境工作原理解析的文章就介绍到这了,更多相关Python 虚拟环境原理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python模块之re正则表达式详解
Feb 03 Python
django js实现部分页面刷新的示例代码
May 28 Python
pandas实现将dataframe满足某一条件的值选出
Jun 12 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
python已协程方式处理任务实现过程
Dec 27 Python
浅谈python累加求和+奇偶数求和_break_continue
Feb 25 Python
关于python 跨域处理方式详解
Mar 28 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
python基于openpyxl生成excel文件
Dec 23 #Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 #Python
用python计算文件的MD5值
Dec 23 #Python
python中lower函数实现方法及用法讲解
Dec 23 #Python
Python类型转换的魔术方法详解
Dec 23 #Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 #Python
python音频处理的示例详解
Dec 23 #Python
You might like
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
php获得url参数中具有&的值的方法
2014/03/05 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
详谈PHP编码转换问题
2015/07/28 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
js模糊查询实例分享
2016/12/26 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
python实现list由于numpy array的转换
2018/04/04 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
python3判断url链接是否为404的方法
2018/08/10 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
师范生实习自我鉴定
2013/11/01 职场文书
体育教育毕业生自荐信
2013/11/21 职场文书
运动会稿件200字
2014/02/07 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
公司联欢会策划方案
2014/05/19 职场文书
工程负责人任命书
2014/06/06 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
开天辟地观后感
2015/06/09 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis