Python 虚拟环境工作原理解析

 更新时间:2020年12月24日 09:55:37   作者:悟空小饭  
这篇文章主要介绍了Python 虚拟环境工作原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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 官方文档,细节可以参考该文档。

Creation of virtual environments Python3 提供的 venv 介绍,包括常见参数以及配置文件。

 

← Older

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

相关文章

  • Python多进程使用及进程池详解

    Python多进程使用及进程池详解

    这篇文章主要为大家介绍了Python多进程使用及进程池详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • python暴力解压rar加密文件过程详解

    python暴力解压rar加密文件过程详解

    这篇文章主要介绍了python解压rar加密文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python+Pygame实现趣味足球游戏

    Python+Pygame实现趣味足球游戏

    这篇文章主要为大家分享了一个基于Python和Pygame实现的一个趣味足球游戏,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以参考一下
    2022-05-05
  • python批量提取图片信息并保存的实现

    python批量提取图片信息并保存的实现

    这篇文章主要介绍了python批量提取图片信息并保存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 利用Python实现自动生成图文并茂的数据分析

    利用Python实现自动生成图文并茂的数据分析

    这篇文章主要介绍了利用Python实现自动生成图文并茂的数据分析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • python的变量与赋值详细分析

    python的变量与赋值详细分析

    这篇文章主要介绍了python的变量与赋值详细分析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 在Python下进行UDP网络编程的教程

    在Python下进行UDP网络编程的教程

    这篇文章主要介绍了在Python下进行UDP网络编程的教程,UDP编程是Python网络编程部分的基础知识,示例代码基于Python2.x版本,需要的朋友可以参考下
    2015-04-04
  • Python实现对比两个Excel数据内容并标记出不同

    Python实现对比两个Excel数据内容并标记出不同

    日常工作中需要对比两个Excel工作表中的数据差异是很不方便的,使用python来做就比较简单了!本文为大家介绍了python实现对比两个Excel的数据内容并标记出不同数据的示例代码,需要的可以参考一下
    2022-12-12
  • 详解Pycharm第三方库的安装及使用方法

    详解Pycharm第三方库的安装及使用方法

    这篇文章主要介绍了详解Pycharm第三方库的安装及使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • python linecache 处理固定格式文本数据的方法

    python linecache 处理固定格式文本数据的方法

    今天小编就为大家分享一篇python linecache 处理固定格式文本数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论