当前位置: 首页 > 科技观察

一个提升50%Python开发效率的工具包

时间:2023-03-13 18:21:28 科技观察

依赖管理在编程语言中一直扮演着至关重要的角色,无论是Python、JavaScript、Java还是Go。不同编程语言的依赖管理工具虽然不同,但追求的目标是相似的。可以对项目进行更简单、统一的管理,可以更方便的进行项目的迁移和部署。因此就有了maven、npm、pip等依赖包管理工具。但是,相对于Java和JS,Python在依赖管理上更为特殊。因此,各种不同的管理工具相继出现,每一次升级都是为了更好的管理Python的依赖包管理工具。Python在依赖包管理方面的主要特殊性来自于不仅需要考虑项目以来的第三方包,还需要考虑虚拟环境。这是由于Python和Java、JS等编程语言的根本区别。Java和JS是按项目隔离的。每当开发一个项目时,依赖包都会安装在项目路径下。每个项目都是隔离的,这样即使不同的项目使用同一个包的不同版本,它们之间也不会有冲突。但是,Python不同。在Python中,不能通过项目来隔离依赖包。当我们使用pip安装第三方包时,所有的依赖都会被安装到安装目录下的site-packages中。试想一下,如果我们开发项目A,使用TensorFlowv0.1。但是,要开发项目B,需要TensorFlowv0.2。这时候site-packages下的依赖包就会发生冲突,后面安装的依赖包会先卸载之前安装的版本,再安装新版本的依赖包。显然,这是非常不友好的。为了解决这个问题,虚拟环境起着至关重要的作用。在开发不同的项目时,可以创建和激活不同的虚拟环境。这样不同的项目会在不同的环境中使用解析器,我们也可以将依赖包安装到不同虚拟环境的site-packages路径中。所以Python中的依赖管理一般是指依赖管理+虚拟环境。过去经常使用两个工具来进行Python依赖管理和虚拟环境:pip和virtualenv。其中pip用于管理依赖包,virtualenv用于管理虚拟环境。这样虽然解决了不同项目之间的环境隔离问题,但也存在明显的不足:需要同时依赖两种管理工具不能动态更新requirements.txt其中,比较突出的问题是第二点。在项目开发过程中,需要一个配置文件来记录依赖包和环境参数,例如maven的pom.xml,npm的package.json。Python中常用的是requirements.txt。这种纯文本格式只能用来记录依赖包的名称,不能像yaml、json、xml等文本存储格式那样记录更多的环境参数信息。另外,比较致命的一点是,每次导出依赖包,都需要手动执行pipfreeze>requirements.txt命令。显然,这是非常不合理的。试想一下,如果你因为忙而忘记手动执行这个操作,你将花费大量的精力将其部署到生产环境并发现错误,这将造成很大的损失。于是,pipenv诞生了。pipenvpipenv是2017年由requests和flask等知名工具包作者KennethReitz发布的Python依赖包管理工具。pipenv可以看作是pip+virtualenv这两个工具的组合,它集成了pip的依赖包管理和virtualenv虚拟环境管理。另外在依赖包记录方面用Pipfile替换原来的requirements.txt。而且它可以自动记录和更新记录文件,这样就不用再手动执行命令更新requirements.txt了。pipenv的出现确实大大降低了Python依赖包管理的复杂度,提高了项目开发和项目迁移的效率。所以这几年对pipenv的评价一直很好,各大内容平台上都有很多赞美pipenv的文章。不过我至今没有成为pipenv的忠实用户,我也不会选择pipenv来替代原来的pip+virtualenv方案。相信那些夸奖pipenv的作者未必是它的忠实用户。不可否认,pipenv在Python依赖包管理方面提供了很好的解决方案。但是,它仍然存在一些致命的缺陷,这比原来的pip+virtualenv方案繁琐的手动操作更加困难。锁定速度慢。强制更新不相关的依赖项。依赖处理效果差。这是解释第3点的示例。使用pipenv安装一个包,$pipenvinstalloslo.utils==1.4.0这时候会报错,Couldnotfindaversionthatmatchespbr!=0.7,!=2.1.0,<1.0,>=0.6,>=2.0.0这个的意思error是Unabletofindasuitableversionofpbr,即使有合适的版本,pipenv也会简单的抛出一个错误,无法完成依赖包的处理和安装。这时,一个更优秀的工具包出现了,它就是诗歌。Poetrypoetry是一个第三方工具包,可以管理Python的依赖和环境,可以用于Python项目的打包和分发。诗歌通过配置文件pyproject.toml完成依赖管理、环境配置、基本信息配置等功能。相当于在Python项目中集成了Pipfile、setup.py、setup.cfg、requirements.txt、MANIFEST.in。通过pyproject.toml文件,不仅可以配置依赖包,还可以区分开发、测试、生产环境,配置源码路径。为什么选择诗歌?Poetry相比pipenv有很多明显的优势:更强大的依赖处理功能易于打包构建Python项目易于发布工具包结构化展示依赖关系更强大的依赖处理功能以前面介绍的pipenv为例介绍poetry在依赖处理方面的强大功能。当pipenv在安装工具包时遇到直觉问题,会直接报错终止。用poetry安装不会,$poetryaddoslo.utils=1.4.0-Installingpytz(2018.3)-Installingnetifaces(0.10.6)-Installingnetaddr(0.7.19)-Installingoslo.i18n(2.1.0)-Installingiso8601(0.1.12)-Installingsix(1.11.0)-Installingbabel(2.5.3)-Installingpbr(0.11.1)-Installingoslo.utils(1.4.0)诗遇到pbr的限制(>=0.6,!=0.7,<1.0)条件时满足了,会尝试安装最新的pbr(0??.11.1版本),会选择oslo.i18n==3.20.0,但此时发现oslo.i18n的版本与最新版本冲突的pbr。如果在pipenv中,会报错。但是诗会想办法解决,最后发现oslo.i18n==2.1.0可以满足所有相互依赖。终于成功安装依赖包了。轻松打包构建Python项目在项目开发过程中,项目迁移和项目部署是无法回避的问题。如果我们需要将我们的项目部署到生产环境服务器上,就需要用到Python的打包安装功能。以前会写一些繁琐的setup.py和setup.cfg。poetry中,一行命令即可解决,$poetrybuildBuildingpoetry(1.0.0)-Buildingsdist-Builtpoetry-1.0.0.tar.gz-Buildingwheel-Builtpoetry-1.0.0-py2.py3-none-any.whl很容易发布Toolkit如果想发布项目到PyPI仓库怎么办?在poetry中,只需要简单配置pyproject.toml即可实现一行命令发布工具包$poetrypublishPublishingpoetry(1.0.0)toPyPI-Uploadingpoetry-1.0.0.tar.gz100%-Uploadingpoetry-1.0.0-py2。py3-none-any.whl58%依赖结构化展示Python是一门高度依赖第三方工具包的编程语言。一个项目会用到很多不同的工具包,而这些包的依赖是什么,很多开发者对它们知之甚少。Poetry可以结构化的展示各个工具包的依赖关系,让项目的依赖关系一目了然,$poetryshow--treerequests-toolbelt0.8.0Autilitybeltforadvancedusers...└──requests<3.0.0,>=2.0.1├──certifi>=2017.4.17├──chardet>=3.0.2,<3.1.0├──idna>=2.5,<2.7└──urllib3<1.23,>=1.21.1$poetryshow--latestpendulum2.0.41。4.5Pythondatetimesmadeeasy.django1.11.112.0.3Ahigh-levelPythonWebframework...requests2.18.42.18.4PythonHTTPforHumans。如何用诗?安装诗歌提供了多种安装方式。个人建议选择以下两种方式:方式一:(推荐)$curl-sSLhttps://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py|python方式二:(pip)$pipinstall--userpoetry项目初始化如果你还没有创建项目,可以使用poetry新建项目:$poetrynewpoetry-demo此时会创建一个包含以下内容的项目,poetry-demo├──pyproject.toml├──README.rst├──poetry_demo│└──__init__.py└──tests├──__init__.py└──test_poetry_demo.py除了新建工程,也可以在已有工程的基础上新建工程现有项目。这时候$poetryinit会让你输入包名、版本号等信息,你可以选择输入,也可以按回车使用默认值。依赖包管理安装依赖包可以使用add命令安装一个Python工具包,也可以使用$poetryaddnumpy。通过添加配置参数--dev来区分不同环境下的依赖包。可以使用install命令直接解析安装pyproject.toml的依赖包,$poetryinstall更新依赖包更新所有锁定版本依赖包,$poetryupdate更新指定依赖包,$poetryupdatenumpy卸载依赖包$poetryremovenumpy虚拟环境管理createvirtualenvironment创建虚拟环境环境有两种方式:方式一:如果在配置文件中配置了virtualenvs.create=true,执行poetryinstall时会检查是否有虚拟环境,否则会自动创建。方法二:使用poetryenvuse命令,$poetryenvusepython3.7激活虚拟环境$poetryshell查看虚拟环境信息$poetryenvinfo显示虚拟环境列表$poetryenvlist删除虚拟环境$poetryenvremovepython3.7结论Poetry可能还是有一些不足,但是,它确实为Python依赖项提供了最完整的包管理解决方案。与目前的pip和pipenv相比,有很多明显的优势,项目在GitHub上获得了高达11.2k的star。如果喜欢尝鲜,可以尝试用poetry代替pip+virtualenv或者pipenv进行依赖包管理和虚拟环境管理。很多新事物的出现都会伴随着一些学习成本,比如Java的springboot,JS的umi。一开始,了解这些新东西会花费很多精力,但是一旦你熟悉了它的使用,你会发现你的开发效率会大大提高。