Skip to content
🎨 作者:mikigo 📔 阅读量:

0、缩略语和关键术语定义

术语全称解释
PyPIPython官方的三方包存储平台,在公网上打包发布的Python三方包都是发布到此平台;
pipPython官方默认的包管理工具,提供了对Python包的安装、卸载等功能;
Virtualenv常用的Python虚拟环境管理工具,它可以创建一个或多个独立的Python虚拟化环境;
Python环境虚拟化在一个用户自定义的目录空间,创建一个全新的、完整的Python环境(包含Python解释器、包管理器等), 此Python环境完全与外界Python环境完全隔离(包括系统本身的Python环境、其他Python虚拟环境),因此我们在此虚拟环境中安装的任何三方包不会影响到系统本身的Python环境,反之亦然。用于解决多个项目使用Python包版本冲突的问题。
deb一种软件包格式,deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系统,是一种在 Linux 下非常流行的一种安装包。
rpm和deb一样,是Centos系统的安装包格式,也是一种非常流行的安装包。

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 包管理:

https://zhuanlan.zhihu.com/p/510604386