Python虚拟环境和依赖管理工具-poetry
1. poetry 是什么
Poetry 和 Pipenv 类似,是一个 Python 虚拟环境和项目打包工具,比如打包和发布。它可以让你用 Poetry 来同时管理 Python 库和虚拟环境。
- 主页:https://poetry.eustace.io/
- 源码:https://github.com/sdispater/poetry
- 文档:https://poetry.eustace.io/docs
2. poetry怎么安装
安装poetry的官方命令
$ curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
执行效果:
解决方法:下载get-poetry.py脚本手动安装
脚本地址:https://github.com/python-poetry/poetry/blob/master/get-poetry.py
本地执行该脚本,然后在终端执行 poetry --version 查看是否安装成功
执行效果:
Poetry 怎么用
Python包管理之poetry基本使用 - 知乎 (zhihu.com)
两种情况: 1. 在一个已有的项目里面使用Poetry 2. 创建一个新的Python项目
第一种情况下,需要创建一个pyproject.toml文件
poetry init
根据提示输入项目信息
执行效果:
注:根据它的提示输入你的项目信息,不确定的内容就按下 Enter 使用默认值,后续也可以手动更新。指定依赖的环节可以跳过,手动安装会更高效一点。
第二种情况下,创建一个新的 Python 项目,使用 poetry new <文件夹名称> 命令
poetry new <文件夹名称>,例如poetry new demo
执行效果:
poetry创建虚拟环境
poetry install (会读取并安装pyproject.toml中的依赖,同时会创建虚拟环境,把这些依赖装在虚拟环境里)
poetry env use <python.exe路径>
poetry shell (激活虚拟环境)
poetry env info (查看虚拟环境信息)
poetry env list (查看虚拟环境列表)
poetry安装包
poetry add <包名>
例如 poetry add flask --dev (--dev可以指定为开发依赖)
poetry 查看包
poetry 可以通过一行命令查看所有安装的依赖
poetry show
也可以通过一行命令查看依赖关系
poetry show --tree
还可以查看可以更新的依赖
poetry show --outdated
想要一次性更新所有的依赖
poetry update
只更新某个依赖
poetry update <包名>
poetry 卸载包
还支持更多操作
例如:在 pyproject.toml 配置文件中添加国内镜像源地址配置,提高下载速度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8fj1qJfY-1626507430354)(C:\Users\Administrator\Desktop\风控建模与规则挖掘\镜像源.png)]
入门版 :https://zhuanlan.zhihu.com/p/81025311
基本版:Python包管理之poetry基本使用 - 知乎 (zhihu.com)
优点
- 使用标准的 pyproject.toml 文件,不用写多个配置文件
- 同时支持管理 Python 程序和 Python 库
- 更符合直觉的默认设计,比如不会随便更新锁定版本的依赖
- 干净简洁的命令行输出,没有星星和蛋糕
- 安装包的时候,使用 upper bound 版本限定,而不是 Pipenv 默认的通配符
- 卸载包的时候,直接卸载孤立的子依赖,不需要像 Pipenv 那样需要再执行 pipenv clean
缺点
- 引入新的 pyproject.toml 标准,旧项目需要一点迁移成本和学习成本
- 会有一些潜在的 bug
- 解析依赖的过程偶尔会久一点
- 对虚拟环境的管理控制有些弱,没有 Pipenv 那样的删除虚拟环境和清空依赖的操作
- 缺少一个稳定的维护团队,有大量 issue 和 PR 等待处理,但情况在逐渐好转
当然,你还是可以选择继续使用 virtualenv/venv 和 pip 这些基础工具,直到有一个完美的解决方案出现。或者,也可以选择试试新东西,然后尝试改进它,让完美的解决方案早一点出现。
学习poetry历程
- 首先要知道的的是依赖的概念,简单的说就是一个项目或者一个程序要运行所依赖某些包/库(pandas, numpy, scikit-learn)等等。
- 依赖管理工具(maven, npm, pip)等。python包基本都可以通过pip install 安装, pip uninstall 卸载
- 虚拟环境,Python和Java、JS这些编程语言本质上存在差异导致,Java、JS是以项目进行隔离,每当开发一个项目,依赖包都是安装在项目工程路径下。每个工程之间是隔离的,这样,即便是不同工程用到同一个包的不同版本,它们之间也不会产生冲突。
但是,Python则不同,在Python中无法通过工程对依赖包进行隔离。当我们之间使用
pip
安装第三方包时,所有的依赖都会安装到安装目录下的
site-packages
。
不同的依赖安装到不同的虚拟环境中,然后不同的项目可以基于不同的虚拟环境运行。
- 发现不足:针对Python依赖管理和虚拟环境经常会用到2个工具:
和pip
virtualenv
- 需要同时依赖2款管理工具
- 不能动态更新requirements.txt
- pipenv试图解决这个问题。
pipenv可以看成是pip+virtualenv两款工具的合体,它集合了pip的依赖包管理和virtualenv虚拟环境管理于一身。另外,在依赖包记录方面使用Pipfile替代原来的requirements.txt。而且,它能够自动记录并更新记录文件,这样就不再需要手动执行命令来更新requirements.txt
- 但是,它也存在不足
1.Lock速度缓慢 2.强行更新不相干依赖 3.依赖处理效果较差 一个例子:pipenv install oslo.utils==1.4.0 Could not find a version that matches pbr!=0.7,!=2.1.0,<1.0,>=0.6,>=2.0.0 即使你的项目还可以用2.0.0,0.6。pipenv只会简单粗暴的报错,不会灵活处理这个问题。
- 发现了主角poetry的存在
还是上面那个问题,如果是poetry安装的话可能会帮你安装一个最新版,或者某个可用的版本。集成了pipenv的优势,同时还可以用于python工程打包和发布。poetry通过配置文件pyproject.toml来完成依赖管理、环境配置、基本信息配置等功能。相当于把Python项目中的Pipfile、setup.py、setup.cfg、requirements.txt、MANIFEST.in融合到一起。 poetry相比于pipenv具有很多明显优势的功能: 1.更强大的依赖处理功能 2.易于打包和构建Python工程 3.易于发布工具包 4.结构化展示依赖关系
打包和发布python工程
如果需要把我们的工程部署到生产环境服务器上,这时候就需要用到Python的打包和安装功能
$ poetry build
Building poetry (1.0.0)
- Building sdist
- Built poetry-1.0.0.tar.gz
- Building wheel
- Built poetry-1.0.0-py2.py3-none-any.whl
把工程发布到PyPI仓库, 在poetry中,只需要简单配置一下
pyproject.toml
,就可以实现一行命令发布工具包
$ poetry publish
Publishing poetry (1.0.0) to PyPI
- Uploading poetry-1.0.0.tar.gz 100%
- Uploading poetry-1.0.0-py2.py3-none-any.whl 58%
把工程发布到PyPI仓库, 在poetry中,只需要简单配置一下
pyproject.toml
,就可以实现一行命令发布工具包
$ poetry publish
Publishing poetry (1.0.0) to PyPI
- Uploading poetry-1.0.0.tar.gz 100%
- Uploading poetry-1.0.0-py2.py3-none-any.whl 58%
原创不易,资源整合不易,点赞也不易!!
我坚持原创,坚持资源整合,你坚持点赞!!
如果你发现了问题,欢迎留言指正 ❤️ ❤️