工程经验 - 基于 poetry 打包一个 cli 应用

核心步骤

  1. pyproject.toml 的 [tool.poetry.scripts] 定义出命令名称 & 函数入口的 k v 映射

  2. poetry 打包出 wheel 包

  3. pip install 安装 wheel 包并使用命令

安装 pipx & poetry

# pipx
sudo apt update
sudo apt install pipx
pipx ensurepath
sudo pipx ensurepath --global

# poetry
pipx install poetry

创建 poetry 工程

创建工程空目录,并 cd 目录执行

poetry init

注意这个过程中的 python 版本,工程的依赖可以后续添加

创建 python 包,以及程序的入口 py 文件 & 函数,总体的工程目录如下

(pythonProject) waylandzhan@Liangs-MBP pyhello % tree
.
├── README.md
├── dist
│   ├── pyhello-0.0.1-py3-none-any.whl
│   └── pyhello-0.0.1.tar.gz
├── poetry.lock
├── pyhello
│   ├── __init__.py
│   └── cli.py
└── pyproject.toml

cli.py

import click


@click.command()
@click.argument('name')
def hello(name):
    """Simple program that greets NAME."""
    click.echo(f'Hello, {name}!')


if __name__ == '__main__':
    hello()

pyproject.toml

[tool.poetry]
name = "pyhello"
version = "0.0.1"
description = "wayland first cli wheel using pyhello!"
authors = ["waylandzhan"]
readme = "README.md"

# 定义工程依赖,不填写后续安装后运行报错
[tool.poetry.dependencies]
python = ">=3.7, <3.12"
click = "^8.1.3"

# 定义命令以及函数
[tool.poetry.scripts]
pyhello = "pyhello.cli:hello"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

打包 & 测试

在项目根目录运行poetry build

于是会出现 dist 包,里面会有打包好的 wheel

新建一个虚拟环境,并 pip install 此 wheel 包(例如 pyhello-0.0.1-py3-none-any.whl),既可使用命令 pyhello

用例如下:

pyhello tom
Hello, tom!

至此 whl 包完成打包