poetry 包管理使用方法

poetry 是什么

poetry 是一个虚拟环境和包管理的工具,并且还支持打包和发布。
可以用来管理python库和python程序。

功能介绍

安装

pip install poetry

安装后检查版本

poetry --version 

初始化项目

  • 在已有项目中
poetry init
  • 新建一个项目
poetry new new_project
poetry new --src new_project # 将源码放在src目录下

初始项目结构如下:

.
├── poetry.lock
├── pyproject.toml
├── README.rst
├── rick_portal_gun
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_rick_portal_gun.py
  • README.rst 建议改成 .md
  • pyproject.toml 此文件管理依赖列表和项目的各种 meta 信息,用来替代 Pipfile、requirements.txt、setup.py、setup.cfg、MANIFEST.in 等等各种配置文件。

pyproject.toml 文件

[tool.poetry]
name = "elin-portal-gun"  # Require  软件名称
version = "0.1.0" # Require  软件版本
description = ""  # Require  描述
authors = ["Elin <365433079@qq.com>"]  # Require 作者
readme = "README.md"  #  README.rst 或者 README.md
license = "GPL-3.0-or-later"  
maintainers = [""]  # 维护者
homepage = "" # 项目URL地址
repository = "" # 项目仓库URL地址
documentation = "" # 项目文档URL地址
keywords = [""] # 项目标签(max:5)
classifiers = = [
    "Topic :: Software Development :: Build Tools",
    "Topic :: Software Development :: Libraries :: Python Modules"
]  # 项目的分类 https://pypi.org/classifiers/
packages = [
    { include = "my_package", from = "src"}, # 如果包在src/my_package,需要指定from
    { include = "extra_package/**/*.py" },
] # 包含的包,在标准情况下可以不需要,https://python-poetry.org/docs/pyproject/#packages
include = [""] # 包含的文件
exclude = [""] # 排除的文件


[tool.poetry.scripts] # 安装后脚本启动程序。 elin-portal-gun = "elin_portal_gun.main:app" #脚本elin-portal-gun执行时会去找elin_portal_gun包中的main文件执行app()
[tool.poetry.dependencies] # 依赖包 python = "^3.8" typer = {extras = ["all"], version = "^0.4.0"}
[tool.poetry.dev-dependencies] # 开发依赖包 pytest = "^5.2"
[tool.poetry.extras] # 可选依赖,增强包等 mysql = ["mysqlclient"] pgsql = ["psycopg2"]
[tool.poetry.urls] # 任何URL,当发布时会放在 Project Links 下面 "Bug Tracker" = "https://..."
[build-system] # 构建Python项目的标准方法 requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"

包依赖关系描述

config

查看config配置

poetry config --list

设置项:

  • cache-dir 缓存路径
  • virtualenvs.create bool 是否自动创建虚拟环境
  • virtualenvs.in-project bool/None

None:poetry 会在系统特定目录创建一个.venv目录,由下面的 path 参数指定
true: poetry 会在项目根目录创建一个.venv目录,我推荐这种方式,在项目根目录创建虚拟环境,这样就算移动目录位置也不影响虚拟环境的使用
false: poetry 将会忽略已存在的.venv目录

  • virtualenvs.path 虚拟环境路径

激活虚拟环境

poetry shell
  • 查看虚拟环境信息 poetry env info
  • 查看虚拟环境列表以及详细路径 poetry env list --full-path
  • 删除虚拟环境 poetry env remove python

执行脚本

poetry run python app.py

除了以上的使用还可以自定义脚本

[tool.poetry.scripts] 
test = "python test.py" 
serve = "python run.py" 

可以执行poetry run serve

安装包

poetry add typer[all]
poetry add pytest --dev  # 开发依赖

追踪 & 更新包

poetry show
poetry show --tree # 查看依赖关系
poetry show --outdated # 查看可以更新的依赖
poetry update # 更新所有锁定版本的依赖
poetry update dep_name # 更新某个指定的依赖
poetry remove dep_name # 卸载包

切换python版本

poetry env use python3.8

安装项目

根据pyproject.toml安装项目

poetry install
poetry install --no-dev # 不安装开发依赖
poetry install --no-root # 不安装项目本身

构建

poetry build

发布

poetry publish
poetry publish --build # 发布前先构建

要发布到pipy,可以先获取Token

token 就像下面这样:

pypi-wubalubadubdub-deadbeef1234

然后写入到poetry

poetry config pypi-token.pypi pypi-wubalubadubdub-deadbeef1234

然后就可以直接发布了

其他

要想在开发的时候安装其他项目的包该怎么办

我遇到了一个情况,当我同时开发两个包并且有依赖关系的时候,poetry并不能安装另外路径的包

假设packageA依赖packageB

packageB中的虚拟环境安装完后,这时候查看虚拟环境中的Lib/site-packages其实可以看到包含了两样东西:

  1. <packageB>.dist-info
  2. <packageB>.pth

将这两个文件复制到packageA中的虚拟环境路径下的Lib/site-packages中就可以了。

<packageB.pth>里面就是包文件的路径,直接自己写也可以。
例如:

D:/CodeLibrary/git_project/ntc-templates

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 365433079@qq.com