Python虚拟环境——测试工程师Python开发实战(03)

发表于:2023-7-12 09:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:胡通    来源:51Testing软件测试网原创

#
Python
  1.4  Python虚拟环境
  Python之所以强大,除了其本身的特性强大,更重要的是Python拥有非常多的第三方工具。强大的软件库,让开发人员将精力集中在业务上,从而避免重复“造轮子”的浪费。但众多的软件库形成了复杂的依赖关系,加上Python 2和Python 3两个大版本的兼容性问题,这些对管理项目依赖造成了不少困扰。
  在使用Python时,我们可以通过pip来安装第三方工具,但是由于pip的特性,系统中只能安装每个第三方工具的一个版本。但是在实际项目开发时,不同项目可能需要第三方工具的不同版本,这迫使我们需要根据实际需求不断进行更新或卸载相应的第三方工具。而如果我们直接使用本地的Python环境,会导致整体的开发环境相当混乱而不易管理,这时候我们就需要开辟一个独立干净的空间进行开发和部署。
  在创建新项目时创建一个虚拟环境,这样做的好处是把项目环境和操作系统环境分开,避免影响操作系统环境。如果不创建虚拟环境,一股脑地使用pip install安装包,那么安装的包会统一放到操作系统的Python解释器目录的site-packages文件夹下,每新建一个项目,操作系统会自动把site-packages下的所有包都导入,这会使版本管理混乱。
  接下来,我们将逐一阐述Python的基本概念、pipenv特性、pipenv安装、创建虚拟环境、pipenv管理依赖、pipenv安装依赖工具包、常用命令、部署迁移虚拟环境共8块内容。
  1.4.1  基本概念
  我们先解释几个Python中常用的基本概念,方便大家理解后续的内容。
  Python版本。Python版本指的是Python解析器本身的版本。由于Python 3不能与Python 2兼容,两大“阵营”之争持续了很长时间,因此一些软件库需要适配两种版本的Python。同时,开发人员可能需要在一个环境中,部署不同版本的Python,对开发和维护造成了麻烦。
  Python包库。包库或者软件源是Python第三方工具包的集合,可以发布、下载和管理软件包,其中pip一般是从PyPI官网上查找、下载工具安装包的。为了提高下载速度,世界上有很多PyPI的镜像服务器,在国内也有多个软件源。
  虚拟环境。虚拟环境并不是什么新技术,它主要利用操作系统中环境变量和进程间环境隔离的特性,Python的虚拟环境就是利用这个特性构建的。在激活虚拟环境时,激活脚本会将操作系统的环境变量PATH修改为当前虚拟环境的路径,这样后续执行命令时就会在虚拟环境的路径中查找,从而避免了在原本路径查找,从而实现了Python环境的隔离。
  第一次安装Python后,我们就有了一个全局级别的,或者系统级别的环境。我们可以使用虚拟环境工具在全局环境的基础上创建多个相互独立、互不影响的虚拟环境,在这些虚拟环境中可以安装不同版本的包库。从本质上来说,虚拟环境就是相互独立的文件夹,内含Python解释器和相关依赖。
  使用虚拟环境的好处显而易见:
  保持全局环境的干净;
  指定不同的依赖版本;
  方便记录和管理依赖。
  1.4.2  pipenv特性
  常见的虚拟环境管理工具有virtualenv、virtualenvwrapper、pipenv、conda等,本节将重点讲解pipenv这个工具。
  pipenv类似virtualenv,它是一种Python包管理工具,能自动处理各种工具之间的依赖关系,也能解决不同项目对于同一个工具有不同版本需求,而产生的同工具不同版本冲突的问题。pipenv就是pip和virtualenv的结合体,它的出现解决了原有的pip、virtualenv、requirements.txt的工作方式的局限和弊端,能够更有效地管理Python的多个环境、各种第三方工具。pipenv能解决的问题如下。
  requirements.txt依赖管理的局限。使用requirements.txt管理依赖的时候可能会出现版本不确定的构建问题。
  多个项目依赖不同版本第三方工具的问题。例如,应用程序A需要特定模块的1.0版本但应用程序B需要该模块的2.0版本,当我们在A和B应用程序间切换时,需要不断检测、卸载、安装该模块。这意味着只安装一个版本的模块可能无法满足每个应用程序的要求,因此需要创建虚拟环境来将A、B应用程序所需的第三方工具包分隔开来。
  pipenv很好地解决了上述的两大问题,因此具备如下特性,
  pipenv集成了pip、virtualenv两者的功能且完善了两者的一些缺陷。pipenv使用Pipfile和Pipfile.lock,这使得对工具包的管理更为明确。
  pipenv让使用者可以深入地了解第三方工具包的依赖关系图。我们使用命令pipenv graph即可查看第三方工具包的依赖关系图。
  1.4.3  pipenv安装
  pipenv的安装依赖于pip,如果没有配置和安装好pip,需要先安装pip。如果系统中是Python 3,那么可以直接使用pip3进行安装。pipenv安装过程如图1-11所示。命令为pip3 install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple/,其中,-i表示采用指定的地址进行下载安装。
图1-11  pipenv安装过程
  pipenv安装完成后如图1-12所示,在pip相同的目录下会生成pipenv工具的相关文件。
图1-12  pipenv安装成功
  1.4.4  创建虚拟环境
  接下来,通过如下命令创建一个在指定目录下的全新虚拟环境。
  (1)创建目录demo的命令为mkdir demo。
  (2)进入目录demo的命令为cd demo。
  (3)指定使用Python 3.9.8创建虚拟环境,否则为本地默认版本,命令为pipenv install--python/ usr/local/Python-3.9.8/bin/python3。
  pipenv创建虚拟环境成功如图1-13所示。
图1-13  pipenv创建虚拟环境成功
  安装完成后会在项目目录demo下自动生成Pipfile和Pipfile.lock两个文件,目录demo下的文件如图1-14所示,虚拟环境就是通过这两个文件进行管理依赖的。
图1-14  目录demo下的文件
  1.4.5  pipenv管理依赖
  pipenv使用Pipfile代替requirement.txt文件来记录Python第三方工具的信息,另外增加Pipfile.lock文件来锁定Python第三方工具的包名、版本和依赖关系的列表。
  项目提交时,可将Pipfile文件和Pipfile.lock文件提交,待其他开发人员下载,根据此Pipfile文件,执行命令pipenv install来生成自己的虚拟环境。而Pipfile.lock文件用于保证包的完整性。
  1.Pipfile文件
  每次创建环境在当前目录下都会生成一个名为Pipfile文件,用来记录刚创建的环境信息。如果在当前目录下存在之前的Pipfile文件,新的Pipfile文件会将其覆盖。
  Pipfile文件主要用来配置项目依赖的第三方工具、工具包的镜像源、Python解释器的版本等,该文件的示例如下:
# 主要用来配置包的下载网址
[[source]]
# 指定包的安装镜像源,一般使用国内的镜像来加快下载速度
url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true
name = "pypi"
# 项目运行所需要依赖的第三方工具,即下载安装的工具包
[packages]
flask-authz ==='2.4.0'
# * 表示安装最新稳定版本
flask = '*'
# 开发依赖的工具包
[dev-packages] 
# 开发环境需要的包,不常用
# Python 解释器配置
[requires]
# 指定Python解释器的版本
python_version = "3.9"
  2.Pipfile.lock文件
  Pipfile.lock文件是通过哈希算法将包的名称、版本和依赖关系生成哈希值,可以保证包的完整性,锁定Python版本,便于以后项目发布使用固定的包。
  在正常情况下,Pipfile.lock文件不会自动更新工具的版本,例如安装的requests库一开始是2.26.0版本,后来指定安装2.25.1版本,那么Pipfile文件会更新,但是Pipfile.lock文件不会更新,只有手动执行pipenv lock命令后才会更新。
  Pipfile.lock文件保存了包的哈希值,这是确保生产环境和开发环境包信息一致的关键。当我们把项目从开发环境复制到生产环境,我们只需要执行pipenv install,而无须重新安装之前在开发环境中安装的包,这很省心。
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号