想研究一下virtualenv是怎样保证python运行环境独立的。库里边带了几个二进制,导致clone源代码的时候发现库好大啊,当时就祈祷源码不要太多。

目录结构

大体看了一下文件目录,主要文件就一个virtualenv.py。(也确实安装完就这一个文件)
bin/rebuild-script.py这个文件是用来构建新的virtualenv.py文件的。
virtualenv_embedded 文件夹里边的文件是 生成虚拟环境后的脚本,但不是最终版的。上边构建文件将这几个文件插入virtualenv.py
virtualenv_support 几个二进制库

创建一个环境
$ virtualenv ENV
从virtualevn main()入手,2000多行。前边解析参数,extend_parser和adjust_options可以自定义修改参数,目的应该是可以使创建环境的命令简单。after_install是环境创建完成后执行,可以做一些基础包的安装等操作。我猜virtualenvwrapper应该会对这几个函数定义。
--python参数可以指定解析器的版本。resolve_interpreter是返回指定解析器的绝对路径,作者使用path变量和提供的执行文件名组合再判断文件是否存在,是否可执行来判断。我感觉可以直接使用which取一下,差不多。
VIRTUALENV_INTERPRETER_RUNNING是判断是否使用的指定解析器,不是指定解析器,就更改变量,用指定解析器重新执行。是的话就继续执行。在加载文件的时候判断是指定解析器,把virtualenv安装环境的path去掉。

后面删掉了PYTHONHOME,make_environment_relocatable好像是对环境目录移动复制等操作后进行重定向,这个没用过。主要就把环境bin目录下的文件的python执行解析器,修改lib库文件路径
create_environment就是创建环境的函数了,第一个参数是环境根目录,后边都是执行参数。
path_locations 根据不同系统解析器环境,返回要创建的环境的目录
install_python,开始先判断了不能用虚拟环境创建自己,clear参数清除环境下的lib库。使用sys.prefix找到python安装路径,还有一个real_prefix和base_prefix这俩路径官网没查到什么意思
创建新环境的lib文件夹,fix_lib64是为了兼容一些别的环境lib文件夹命名不同,咋不开始就定好。使用os库找到标准库的目录stdlib_dirs.然后将标准库文件软连接到新环境的lib下,copy_file分析了是软连接然后找到真实文件,连接到真实文件上.
还有一个REQUIRED_MODULES必要库,先判断这些必要库是否在标准库里边,不在通过imp.find_module找到,同样添加软连接到lib目录.这个应该也是为了兼容吧.其中lib目录有单独的一套,卧槽 我只能说这是python的坑吗,我觉得肯定不是作者特意写好多。(具体不了解不同系统有啥区别也不想看)
创建lib目录下的site-packages,site又是一套我查.include也是软连接
bin目录python二进制复制,那么多代码都是不同py实现的结果,其实就一句copy.不是windows解析器二进制还有带版本号的。然后测试了一把解析器能不能执行。最后返回新环境python的路径

install_distutils 安装
install_wheel 安装安装包的工具.
install_activate 安装环境的启动退出脚本
install_python_config 安装python_config文件
上边两个模式基本相同,源文件在virtualenv_embedded下,通过编译到virtualenv.py文件里,然后安装的时候替换相关变量,然后生成新的文件。

最后再看看activate.sh文件如何启动
执行这个脚本的时候,先进行deactivate操作,相当于切换环境。主要就是判断之前的环境变量保存的几个变量是否存在,存在还原, 并删除。因为可以不存在,当前使用的system的python环境.ps1也还原
下边进行新环境变量的赋值。记录要切换的环境根目录,path加入环境bin目录, 删掉pythonHOME.更改ps1加上环境名,替换。pydoc重新绑定,变成了现在的pydoc。

然后就没了

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply