0%

poetry_II——配置和使用

poetry配置和使用

我们接下来写一个依赖四个第三方库的百度热搜程序, 最大限度的还原实际开发过程。

配置缓存位置

我们可以使用config命令来管理poetry配置, 比如:

poetry config --list # 列举所有配置条目
注意每一个key的value, 我们需要额外注意如下几个key
* cache-dir # 缓存目录, 字符串
* virtualenvs.path # 虚拟环境目录, 字符串
* virtualenvs.create # 是否使用虚拟环境, Boolean, 如果为真创建虚拟环境
* virtualenvs.in-project # 是否在项目目录下存放虚拟环境, Boolean, 如果为真在项目目录下的ven里创建虚拟环境
* tool.poetry.source # 不可用, 也许以后通过这个能设置pypi源, 目前只能在pyproject.toml文件里手工写入了, 默认值null

poetry config key # 单独查看key的值
poetry config key value # 设置key的value
poetry config unset key # key恢复默认

我们的poetry从网上下载模块后在本地缓存起来了, 这样下次使用的时候不用从网上下载直接用本地缓存的副本, 好处提高速度, 坏处就是占位置。。

此外我们的项目环境也需要空间, 那么我们可以把环境放在项目目录下, 也可以集中放在虚拟环境目录下, 解释参见上面的key列表。

运行poetry config –list命令得知我们的默认缓存目录在,

当前用户家目录下的\AppData\Local\pypoetry\Cache

默认虚拟环境目录在poetry缓存目录下的virtualenvs文件夹下, 也就是说所有项目的虚拟环境都集中存放在这里。

如果你的C盘空间足够大, 那么我觉得没必要改变默认的配置, 直接使用就行, 如果你C盘空间比较紧张的话, 先把缓存目录; 虚拟环境目录都修改到D盘。

我们只要改变缓存目录就可以了, 因为虚拟环境目录引用了缓存目录, 类似于环境变量一样的效果, 只要更改缓存目录虚拟环境目录也跟着改变, 当然只要你愿意可以单独配置虚拟环境目录。

poetry config cache-dir D:\cache\poetry-cache # 设置缓存目录
poetry config --list # 查看所有配置条目

这样以来我们的所有缓存文件都在D盘的cache\poetry-cache文件夹下了, 而虚拟环境目录在该目录的virtualenvs文件夹里, 如果哪天空间不够可以完全删除这些文件, 只要在你的项目里包含pyproject.toml文件就什么都不怕, 我们随时可以重新创建所有一切。

pyproject.toml文件

这个文件好像就像提货单, 只要这个文件在手随时随地都能重建开发环境, 当然poetry需要安装而且网络必须畅通。

pyproject.toml文件的结构

这个文件的内容有如下几个部分:

  • 项目信息, 比如名称; 版本; 简短描述; 作者; 维护者

  • 依赖项 可以是pypi元; 本地其他模块; 网络上的模块

  • 开发阶段依赖项 在正式版本里不包含这些依赖项

  • 其他必要信息 比如 生成项目的工具; pypi元等等

    原则上你不可手工修改这个文件, 但是我们配置pypi元还是需要修改文件的, “在地球上的部分地方写程序你需要掌握相关知识点学会使用相关工具之外, 你必须需要学会忍耐网络connect_error的耐心, 学会和各种网络错误做斗争, 最好系统的学习一下网络原理, 否则一肚子气, 无处发泄!”

    其实这里面的内容非常多, 列举两个重要主题

  • 版本约束 所谓版本约束就是某个依赖项最低是哪个版本; 最高是哪个版本, 特定的一个版本或者多个版本, 排除某些版本等等 举个例子有些软件还在使用sql server2003, 如果你用最新的pythonsql server模块显然不兼容的, 所以我们从python sql server模块历史版本里找到能正常调用sql server2003的历史版本, 作为版本约束写在pyproject.toml文件里, 这样以后这个项目能下载安装正确的依赖项版本

  • 依赖组 比如生成软件文档的某些依赖, 我们可以单独拿出来作为一个依赖组, 默认我们知道的有主要依赖组和开发依赖组但是没有文档依赖组, 那么我们完全可以自定义一个新的依赖组

创建pyproject.toml文件

我们可以使用new或者init命令都能创建这个文件, 但是两者有一些差别。

  • poetry new 项目名称 # 在当前文件夹下创建一个全新的项目, 生成最基本的项目布局和pyproject.toml文件, 自行创建项目文件夹, 没有交互会话

  • poetry init # 在当前文件夹下创建pyproject.toml文件, 不会自行创建项目文件夹, 假定你的项目已经存在, 而且当前文件夹是你项目的根目录, 用户需要回答几个问题

    哪种方式都一样创建pypoetry.toml文件, 如果想要接管已经存在的项目用init命令, 如果新建项目用new命令就可以了。

    如果init的时候遇见两个问题, 一律选择n, 默认答案是y, 如果你选择y在网上搜索包特别慢, 特别慢, 第三个问题记得选择y, 要不然前面的都白干了, 当然也完全可以一路回车也行。

第一个问题: Would you like to define your main dependencies interactively? (yes/no) [yes]
第二个问题: Would you like to define your development dependencies interactively? (yes/no) [yes]
init请自行探索!

这里我们用new命令 :

>poetry new  baidu-hot
Created package baidu_hot in baidu-hot

我们可以看到这个目录下生成了pyproject.toml文件和其他一些文件夹和文件, 至于要不要用这些文件决定权在于我们, 这里我们删掉了除了pyproject.toml文件之外的所有文件。

配置pypi元

这里我们说的非常热闹, 但是我们还没有创建真正的开发环境, 在此之前需要配置pypi元, 有人说poetry直接能调用全局pypi元, 可惜我这边不行。

此外配置用户家目录\appdata\Roaming\pypoetry\config.toml文件也没有起效, 不知道哪里的问题。

所以无奈之下只能把如下内容追加到pyproject.toml文件的末尾,

#设置poetry包管理工具的自定义pypi镜像源配置
[[tool.poetry.source]]
name = "aliyun"
url = "http://mirrors.aliyun.com/pypi/simple"
default = true

添加依赖项

接下来我们可以愉快的添加依赖项了, 用add命令: 绝大多数都是命令的输出, 我加上了适当的注释, 此外高版本的wx必须安装wxpython310。

D:\Src\python\baidu-hot>poetry add requests lxml bs4 wxpython310 # 一次可以添加多个模块, 用空格隔开
Creating virtualenv baidu-hot-l-IYpCe_-py3.10 in D:\cache\poetry-cache\virtualenvs # 创建虚拟环境
# 下面是我们项目的依赖项, 给出了名称和版本
Using version ^2.28.1 for requests
Using version ^4.9.1 for lxml
Using version ^0.0.1 for bs4
Using version ^4.1.2-alpha.2 for wxpython310

Updating dependencies
Resolving dependencies... # 这里慢慢等, 解析依赖的时间比较长, 官方的解释是, 因为每一个模块的数据格式都不统一, 需要大量的分析, 暂时无解, 也许未来找到解决方案

Writing lock file

Package operations: 23 installs, 0 updates, 0 removals # 你看就这么个小项目一共需要安装23个依赖项

# 需要安装的所有依赖项
• Installing pyparsing (3.0.9)
• Installing soupsieve (2.3.2.post1)
• Installing atomicwrites (1.4.1)
• Installing attrs (22.1.0)
• Installing certifi (2022.6.15)
• Installing charset-normalizer (2.1.0)
• Installing colorama (0.4.5)
• Installing beautifulsoup4 (4.11.1)
• Installing idna (3.3)
• Installing numpy (1.23.1)
• Installing pillow (9.2.0)
• Installing pluggy (0.13.1)
• Installing more-itertools (8.14.0)
• Installing packaging (21.3)
• Installing py (1.11.0)
• Installing six (1.16.0)
• Installing urllib3 (1.26.11)
• Installing wcwidth (0.2.5)
• Installing bs4 (0.0.1)
• Installing lxml (4.9.1)
• Installing wxpython310 (4.1.2a2)
• Installing pytest (5.4.3)
• Installing requests (2.28.1)

终于把需要的环境都安装妥当了, 接下来开始真正的着手开发我们的软件。

锁定文件

不过在此之前, 还需要看看我们的项目目录, 发现新生成了一个文件叫poetry.lock, 这是一把锁, 可以用文本编辑器打开瞧一瞧, 里面都是什么玩意.

这里面记录了poetry分析报告, 换句话说poetry通过pyproject.toml文件来分析给出poetry.lock这个结果文件。

那么问题来了, 我们的pyproject.toml文件里已经列举了所有的依赖项, 那么多出一个poetry.lock文件有什么用?

  • 提高效率,我们知道poetry分析依赖关系很慢, 官方自己也承认, 如果有这个锁定文件那么不用第二次分析依赖关系, 直接从锁定文件里拿来使用就可以了

  • 版本锁定 任何一个活跃的依赖项都一直在开发, 一直在发布新版本, 那么你的项目依赖某个依赖项的特定版本, 如果安装的不是这个版本, 而是最新版本, 那么我们的项目就很有可能出现问题了, 如果直接锁定某个版本不会因为依赖项的版本更迭而影响到我们的项目。

  • 保证团队开发环境相同, 有这个锁定文件能确保项目组的所有人员都在相同的开发环境上工作, 团队的虚拟python环境一样, 团队的依赖项也相同

    所以结论, pyproject.toml决定大政方针, 而poetry.lock文件规定实施细则。

    有没有觉得心里爽, 我们用pyproject.toml文件决定最基本的方向, 我需要哪些模块, 这些模块是哪个版本的, 然后poetry根据你的要求分析生成了具体的计划书, 这个模块用这个版本, 而且这个模块也依赖其他这些模块。 锁定文件里也记录了依赖项文件的哈希值。

实际体验

代码不多, 直接在项目目录下创建一个app.py文件, 内容如下:

# --*-- Encoding: UTF-8 --*--
#! filename: baidu_hot/app.py

# 在列表框上显示百度热搜

import requests
import wx
import bs4

def downloadBaiduHot():
'''
returns 热搜标题列表
'''
results = None
url = "http://www.baidu.com/"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.71"}
response = requests.get(url, headers=headers)
if response.ok:
soup = bs4.BeautifulSoup(response.text, "lxml")
results = []
# 留意select函数的返回类型
for element in soup.select(".s-hotsearch-content")[0]:
results.append(element.text)

return results

if __name__ == "__main__":
app = wx.App()
results = downloadBaiduHot()
if results is None:
wx.MessageBox("加载失败")

# 先创建一个窗口或者叫框架, 然后在这个框架里放置一个面板, 在把列表框放到这个面板上, 否则的话tab键没有焦点
frame = wx.Frame(None, title="百度热搜")
panel = wx.Panel(frame)
listBox = wx.ListBox(panel)
listBox.Set(results)
frame.Show()
app.MainLoop()

运行项目

这个时候我们首先需要进入项目虚拟环境下, 如果在你的全局环境下已经有lxml; requests; bs4和wxpython那么先卸载掉这些模块, 以便于我们测试虚拟环境。

python app.py
报错, importError
poetry shell
python app.py
# 成功运行

所以实际运行项目之前不要忘了先进入到虚拟环境下, 退出虚拟环境用exit就可以了。

到目前为止我们的项目下有三个文件, 我们简单梳理一下:

  • app.py 项目代码

  • pyproject.toml poetry依赖管理描述文件

  • poetry.lock poetry锁定文件, 能有效的提高解析速度

    此外我们的项目依赖项缓存在d:\cache\poetry-cache\目录下, 我们的虚拟环境包括依赖项都在d:\cache\poetry-cache\Virtualenvs\项目名称-python版本\下。

    如果你因为各种原因重建项目环境, 比如清理磁盘删掉了依赖项缓存或者整个环境, 买了新电脑了, 那么可以使用,

cd 项目目录 # 这里必须存在pyproject.toml文件
poetry install

这样的话可以重新安装你的项目环境了。

当然据说可以单独配置某个项目, 方法就是在当前项目根目录下放一个config.toml文件。

其他更多用法请自行探索, 此外文末留下一些参考主题, 大家可以进一步探索, 本篇只是带你感性的认识一下依赖管理这样一个主题, 要想真正的使用还是需要系统的学习的。