0、缩略语和关键术语定义
1、相关技术背景(背景技术),与本发明最相近似的现有实现方案(现有技术)
在许多Linux操作系统上通常默认安装了Python环境,系统自带的Python环境是指的安装在系统目录(/usr/bin/)下的Python环境,在系统Python环境下使用pip安装的Python三方包也都是安装到系统目录下(/usr/local/lib/python3.7/site-packages)。
如果我们所有的Python三方包都安装到系统目录下,就会出现多个项目使用不同Python包版本冲突的问题,比如,有两个Python项目A和B,项目A依赖包:abc,版本为1.0,项目B也依赖包:abc,版本为2.0,若两个项目都在系统环境下安装abc这个依赖包,其中一个的依赖环境就会被覆盖,运行时就会因为依赖问题报错,这就是版本冲突。
为了解决版本冲突的问题,前辈们就提出了“Python环境虚拟化”概念,在Linux上Python环境虚拟化方案有很多,比如:Virtualenv、Venv、Canda等,这些环境虚拟化方案(工具)逻辑上都是在某个目录下创建一个全新的Python环境,所有的三方包安装、卸载等操作都在此目录下进行,以此来达到于其他Python环境隔离的目的。
1.1、与本发明相关的现有技术
1.1.1、现有技术的技术方案
以Virtualenv举例,Virtualenv是Python非常常用的环境虚拟化方案,它在初始化时会创建一个全新的虚拟环境的时候,会将Python的解释器以及pip都同时创建好,后续用户可以使用虚拟环境里面的pip工具,对虚拟环境里面包进行管理(安装、卸载、升级等),这样就能实现虚拟环境里面的Python环境与外界Python环境完全隔离(包括系统本身的Python环境以及其他Python虚拟环境),从而解决了多个项目使用Python包版本冲突的问题。
1.1.2、现有技术的缺点
在Python世界里,大部分的三方包发布都是通过PyPI来发布的,包格式为:whl和tar.gz,因此使用者下载三方包采用pip安装,根据前面的描述可知,这部分包是可以直接使用常规Python虚拟化方案进行管理的;
而还有一部分三方包发布的包格式为:deb包(Debian系)、rpm包(Centos系)(下面就统一用deb包来描述),这类主要存在于Linux系统中,其对应包管理器是apt、yum,这些Python的deb包使用apt或yum安装后只能安装到系统环境中,无法安装到Python的虚拟环境中。
也就是说,同样是Python三方包,使用来自PyPI的Python包能使用Virtualenv等工具进行虚拟化进行管理(安装、卸载、升级等),而使用apt或yum安装的Python包不能被虚拟化环境管理。
2、本发明技术方案的详细阐述
2.1、本发明所要解决的技术问题
在对Linux操作系统自动化测试实践过程中,自动化测试项目所需要的依赖既包含了pip安装的Python三方包(如:Pytest、PyAutoGUI等),也存在apt安装的Python三方包(如:python3-pyatspi、python3-opencv等),这些包都是必须的。
如果所有的依赖都安装在操作系统环境中,就会出现多个自动化项目使用Python三方包版本冲突的问题,如果为了解决这个问题采用常规的Python环境虚拟化方案又会出现apt安装的Python包无法安装到Python虚拟环境的问题。
因此,我们要解决的技术问题是,如何在Python虚拟环境中,既能对pip安装的Python包进行管理(安装、卸载、升级等),同时也能对apt安装的Python包进行管理。从而能让Linux上依赖不同来源三方包的Python项目也能实现虚拟化,彻底解决多个Python项目间版本冲突问题。
2.2、本发明提供的完整技术方案
本技术方案通过对使用apt安装的Python deb包安装过程进行拦截,将deb包安装位置动态加载到Python虚拟环境中,从而实现在Python虚拟环境中安装deb包的功能,卸载时只需要将虚拟环境中的deb包删除即可。

图(1)不同来源Python包的安装流程
2.2.1、创建并激活Python虚拟环境
基于操作系统中默认的Python环境,在用户指定目录下拷贝生成一个全新的、完全干净的Python环境,此Python环境仅包含Python解释器、Python标准库、pip相关模块,不存在任何Python三方包。
创建并激活Python虚拟环境后,记录好此Python虚拟环境的路径,以便后续安装Python deb包时使用。
2.2.2、判断Python包的来源
根据包的格式进行判断,whl包用于pip安装,deb包用于apt安装;
2.2.3、动态拦截apt安装过程
若为whl包,直接调用Python默认的包管理器pip进行安装,会自动安装到虚拟环境中,由于是常规操作,这里不做过多解释。
若为deb包,调用动态拦截模块进行安装到虚拟环境中,动态拦截安装的过程具体为:调用apt对deb包进行下载,但不进行安装,因为如果安装必然会安装到操作系统环境中,因此下载deb之后,将其进行拆包,得到此三方包的源代码,最后将所有源代码移动到虚拟环境路径中,从而实现了将deb包安装到Python虚拟环境的功能。

图(2)deb包安装到Python虚拟环境过程
2.2.4、Python包卸载
在Python虚拟环境中卸载包时,由于所有的三方包都是以源代码的形式存在于虚拟环境中,因此,只需将三方包的源代码删除即可,无需区分包的来源。
2.3、本发明技术方案带来的有益效果
(1)解决了传统Python虚拟化方案(工具)无法管理Python的deb或rpm包的问题,真正意义上实现了对所有Python三方包的虚拟化管理。
(2)让基于Linux系统的Python项目完全实现虚拟化环境部署,彻底解决不同自动化测试项目环境依赖之间的版本冲突问题。
(3)基于虚拟化环境部署,有效提升不同自动化项目环境部署的灵活性和自主性;
2.4、针对上述技术方案,是否还有替代方案同样能完成发明目的
无
3、本发明的技术关键点和欲保护点是什么
(1)通过拦截deb包安装过程,将其动态的安装Python虚拟环境中;
(2)提供一种技术方案,使得基于Linux包管理器发布的Python包,也能在Python虚拟环境中进行管理;
4、附件:
参考文献(如专利/论文/标准等)
Python虚拟环境:
https://blog.csdn.net/qq_45261963/article/details/114324148
使用 apt 进行 Linux 包管理:
