Do1e

Do1e

github
email

使用Poetry打包Python專案為wheel

此文由 Mix Space 同步更新至 xLog
為獲得最佳瀏覽體驗,建議訪問原始鏈接
https://www.do1e.cn/posts/code/poetry


起因#

目前維護這兩個 Python 輪子:

之前一直使用的是setup.py進行打包,不過 11 月份更新NJUlogin時發現這樣的一個提示:

********************************************************************************
With Python 2.7 end-of-life, support for building universal wheels
(i.e., wheels that support both Python 2 and Python 3)
is being obviated.
Please discontinue using this option, or if you still need it,
file an issue with pypa/setuptools describing your use case.

By 2025-Aug-30, you need to update your project and remove deprecated calls
or your builds will no longer be supported.
********************************************************************************

因此決定使用新的pyproject.toml的方式進行打包。當時臨時學了Poetry並給NJUlogin做了適配,今天更新mijia-api想順便也做一個適配,結果發現忘了怎麼用,還是寫個博客記錄一下吧。看來之後也多多用Poetry來管理依賴了。

原本的打包腳本 ```powershell remove-item dist -force -recurse python setup.py sdist build python setup.py bdist_wheel --universal twine upload dist/* ```

Poetry#

Poetry官網上對自身的定位是:Python packaging and dependency management made easy。用起來有點像npm(如果你對 nodejs 有一定了解的話),也是通過命令行修改管理依賴的文件。

不過 poetry 有點太長了,從現在開始你就叫pop吧。

alias pop='poetry'
Set-Alias pop poetry

安裝#

直接查看文檔吧:https://python-poetry.org/docs/#installation
我這裡用的是 pipx 進行安裝

初始化已有項目#

pop init

得到下述pyproject.toml文件

[tool.poetry]
name = "mijiaapi"
version = "0.0.0"
description = "A Python API for Xiaomi Mijia"
authors = ["Do1e <[email protected]>"]
license = "GPLv3"
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"

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

不過因為我的包裡面包含大寫字母,需要把[tool.poetry]下面的name改了的同時,再額外手動加一個packages項,另外再把setup.py中的一些其他配置加上來:

2c2
< name = "mijiaapi"
---
> name = "mijiaAPI"
7a8,17
> homepage = "https://github.com/Do1e/mijia-api"
> repository = "https://github.com/Do1e/mijia-api"
> packages = [
>     {include = "mijiaAPI"}
> ]
> classifiers = [
>     "Programming Language :: Python :: 3",
>     "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
>     "Operating System :: OS Independent",
> ]

新建 Peotry 虛擬環境並安裝依賴#

默認會在~/.cache/pypoetry裡創建虛擬環境,可以使用pop config進行修改,詳見文檔這裡,我個人更習慣放在項目目錄中:

# 配置虛擬環境放在項目目錄中
pop config virtualenvs.in-project true
# 新建並使用虛擬環境
pop env use python
# 如果是在conda環境中使用就不需要了,會直接使用已有conda環境
source .venv/bin/activate

之後便可以從requirements.txt中將依賴一個一個安裝上了,下面這個命令會將依賴寫入pyproject.toml文件中並生成poetry.lock

pop add requests qrcode

Peotry 的一大優勢就是能夠以樹狀形式展示依賴:

pop show --tree
# qrcode 8.0 QR Code image generator
# └── colorama *
# requests 2.32.3 Python HTTP for Humans.
# ├── certifi >=2017.4.17
# ├── charset-normalizer >=2,<4
# ├── idna >=2.5,<4
# └── urllib3 >=1.21.1,<3

至此,可以將原來的setup.py刪除了。

打包並發布#

版本可以使用poetry-dynamic-versioning動態指定,不用每次修改pyproject.toml指定版本號。

git tag v1.3.0
pop self add "poetry-dynamic-versioning[plugin]"
pop dynamic-versioning enable

此時就可以簡單地使用一行命令構建了:

pop build

不像 twine 使用~/.pypirc保存 pypi 的 token,Poetry 需要額外進行配置:

pop config pypi-token.pypi pypi-xxxxxx

然後就可以發布了!

pop publish
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。