0%

poetry_I——介绍

依赖管理介绍

在编写程序的时候我们的软件项目需要源代码管理, 最好的源代码管理工具应该是git, 所以特别值得大家学习使用……

关于git的主题比较大, 这次我们说另外一个重要主题依赖管理!

什么是依赖管理

在实际编写程序的过程中我们的项目需要依赖其他若干个已经存在的模块, 在这些模块的基础上进一步的开发, 就像搭积木一样,

这些模块已经是其他人开发完成的, 我们直接拿来使用就可以了, 所以这些模块都被形象的称之为轮子!

请注意, 这里的模块是python里的说法, 在其他语言有其他语言的术语, 比如软件包; 类库; 函数库; 组件; API等等。

轮子自给自足还是拿来主义

那么轮子能不能自己实现, 完全不去调用其他人的代码?

理论上你完全可以在一个裸机上从零开始创造你的软件帝国, 但是需要的知识; 时间和经历那是不可想象的,

所以有人感慨“人生苦短我用python!”

从这句话可见计算机软件系统的庞大和复杂!

轮子自给自足或者拿来使用, 这里面的取舍可以自行考虑, 比如说你的目的是开发爬虫程序, 那么你手写html解析器是不太明智的, 反而直接使用专门解析html的轮子提高你的工作效率。

如果你想要学习数据结构只会调用个线程的html解析模块没有太大意义, 反而需要手工实现一个html解析器, 哪怕你实现的版本方方面面连人家的的1%都不如, 但是你从这个过程里学到很多东西……

所以自己造轮子还是用已经存在的这是一个取舍问题, 主要看你的目的, 任何问题都不可片面的看待, 还是需要辩证的看待问题。

轮子从哪里找

我们的操作系统给你提供了直接能使用的轮子, 比如说, 我们可以调用win32api直接可以编写功能强大的windows应用程序, 同样的道理我们可以在浏览器上通过h5; js和css创建网页, 在手机上通过Android api创建移动app。

此外编程语言自带子弹, 比如说我们的c语言提供了很多方便好用的标准函数库, 这个方面最能吹的应该是golang, golang号称很多事情标准库都能找到合适的轮子, 对第三方依赖很少, 当然我觉得这里的水分还是比较大, 听一听就行了。

还有一些成体系的生态也提供了大量的轮子, 比如Java语言的jvm平台, 微软的dotnet平台等等。

此外就是第三方提供的轮子了, 有的收费, 有的免费, 当然免费也有它的约束力, 不是说免费使用轮子能够为所欲为的! 需要遵守许可协议, 当然这些许可证就是在道德上约束你, 如果你非要违反许可协议那也没办法。

扯了那么多, 总结一下, 轮子要么使用自带的子弹, 要么从第三方平台上找。 比如GitHub这样的代码托管网站, pip这样的某种编程语言的集中管理模块的平台等等。

如果继续扯下去话题肯定是跑偏的, 总而言之, 我们需要知道轮子无处不在, 这些轮子大体上分为两类, 自带的轮子和第三方轮子。 我们依赖管理主要解决的就是第三方轮子之间的相互关系。

实际举例,

一个实时显示百度热搜榜的应用程序需要如下几个其他开发者提供的模块。

  • requests 号称最友好的http请求库, 用这个从百度的服务器上获取内容

  • bs4 html解析库 从百度服务器上返回的是html, 我们需要解析获取到对我们有用的信息, 俗称 洗数据

  • lxml 可选 效率非常高的xml解析器 bs4通过这个库来解析html文档, python默认的性能比较低下

wxpython 图形用户界面开发库 实际内容通过用户界面来展示

一个小小的项目都需要四个依赖模块, 所以有人调侃说《你一个项目不依赖个几个其他库, 都不叫一个完整的项目了!》, 如果遇到中等项目或者更大的项目手工管理依赖模块是不可想象的。

依赖管理具体工作内容

手工依赖管理不光光是数量的问题, 还有版本, 依赖模块的依赖模块; 开发环境和生产环境问题等等, 具体而言

a模块的某个版本只能兼容b模块的某个特定版本,而且你依赖的四个模块也许他们也依赖其他模块, 在开发阶段需要用到一些模块, 但是在生产环境上就不需要这些模块, 这样问题就变得特别复杂, 所以说依赖管理应该是非常重要的。

所以我们必须使用工具来完成如上几个工作!

python依赖管理的现状

说起python的依赖管理那真是群魔乱舞; 各显神通, 好不热闹。

我们最开始接触到的是pip, 动不动就pip install package_name应该是轻车熟路了, 但是这些模块都是全局安装的, 不利于精细化依赖管理。

后来升级到了requirements.txt文件, 所有的依赖模块的名称和版本都保存到这个文件里, 能够批量安装了, 这样我们不需要一个一个的安装依赖包了。

但是问题是所有的模块都安装在一个全局环境的话也许带来不可意料到的事情, 好比你学会了许许多多的武功, 但是有些武功可能相互冲突直接就走火入魔了呢!

下一个阶段出现了python虚拟环境virtualenv, 这个可以把系统的python环境和多个虚拟python环境隔离开, 这样这些虚拟环境相互隔离, 独立运行, 每个环境安装的模块不同, 也不会相互施加副作用, 虚拟环境和pip合体确实简化了很多工作, 但不是完美的方案……

pipenv是另外一个尝试解决python依赖管理的工具链, python官方也推荐过, 不过据说也有一些缺陷, 具体情况不得而知了。

我们知道python号称胶水语言, 各种各样的模块众多, 但是我们从上面的叙述当中可以看到至今也没有一个统一的依赖管理工具链, 可以说是乱七八糟; 五花八门, 实在让人无从下手……

我试着去学习使用一些python工具链, 可惜没有一个让我满意的, 就像男女之情一样, 如果对某个异性没有感觉就是没有感觉, 在怎么锲而不舍也无济于事, 直到遇见
(poetry)[https://github.com/python-poetry/poetry]

poetry介绍

poetry最大的优点是简单直接, 基本上把整个python项目管理工具链都整合在一起了, 比如依赖管理; 虚拟环境管理和模块打包发布等等, 只要在你的项目里包含一个pyproject.toml文件, 那么你完全可以在任何环境重建你的项目, 而且重建的过程和第一次丝毫不差, 就像回放操作一样, 这里最大的不确定因素是python本身的版本问题。

至于如何在一个系统下让多个python和睦共处是我们下一个主题的内容了。

我们的poetry和rust编程语言的cargo工具一样, 所以poetry是python的cargo!

当然如果有比poetry更好的工具, 你也可以出来介绍一下, 我这些也可以说是抛砖引玉……

poetry安装

安装总体上三种方式

  • 脚本安装 通过curl这样的工具下载一个脚本, 然后这个脚本下载安装所需的所有文件, Linux bash Windows powerShell可以这样安装, 网络问题需要解决, 说起这些也是一把辛酸泪啊!!!

  • 通过pipx安装 我们这次就是这么干的, 另外官方不推荐pip安装, 主要是为了避免循环依赖

  • 离线包安装, 下载获取poetry的脚本, 获取离线安装包然后在安装, 具体说的话先下载curl下载的python脚本, 然后从poetry项目的发布页面上下载压缩包。

    这里我们pipx安装就可以了, 首先安装pipx

pip install pipx # 常规操作
pipx install poetry # 安装poetry

打开一个新的命令提示符输入poetry看看输出结果。

请注意如果没有找到poetry需要手动把poetry路径加入到path环境变量里, 具体路径是用户家目录.local\bin\

到此为止我们就有了一个poetry工具。

下一次我们实际体验一下这个工具, 带着大家真正的实践一下, 到时候写一个简单获取百度热搜的程序。

关于安装有疑问下面提出来……