前言
本文介绍如何通过pyproject.toml打包一个简单的 Python 项目,以供他人使用 pip install xxx 指令安装。
Python从PEP 518开始引入的使用pyproject.toml管理项目元数据的方案。
该规范目前已经在很多开源项目中得以支持:
- Django
- Pytest
- SciPy
- poetry包管理
更多信息查看官网
一、准备构建包的文件
我的项目文件目录结构如下:
感兴趣可以到我的git获取代码
.
├── cards_proj
│ ├── LICENSE
│ ├── README.md
│ ├── pyproject.toml
│ └── src
│ └── cards
│ ├── __init__.py
│ ├── api.py
│ ├── cli.py
│ └── db.py
项目说明:
- cards_proj: 可以是任意的目录名,这里是我的项目根路径及项目名称
- pyproject.toml : 是打包配置文件
- src : 里面存放的是程序代码
- cards : 是你期望发布的模块包名(官方建议是在包名后面加上自己的用户名,防止和现有库名重复)
- LICENSE : 是许可信息,MANIFEST.in 非必需,如果需要打包代码文件夹以外的文件要在这里面配置
- README.md : 就是 readme 文件,非必需。
pyproject.toml配置
pyproject.toml 是一个配置文件,用于指定Python项目的构建系统和依赖关系。以下是一个简单的 pyproject.toml
文件示例,它指定了项目名称、版本、依赖关系和开发依赖:
[build-system]
requires = ["flit_core >=3.2,<4"]
build-backend = "flit_core.buildapi"
[project]
name = "cards"
authors = [{name = "Brian Okken", email = "brian+pypi@pythontest.com"}]
classifiers = [
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
]
requires-python=">=3.7"
dynamic = ["version", "description"]
dependencies = [
"tinydb==4.5.1",
"typer==0.3.2",
"rich==10.7.0"
]
[project.optional-dependencies]
test = [
"pytest",
"faker",
"tox",
"coverage",
"pytest-cov",
]
[project.urls]
Home = "https://github.com/okken/cards"
[project.scripts]
cards = "cards:app"
- [build-system] 指定了构建系统的要求和后端,支持 Hatchling、setuptools、Flit、PDM。这是pypi 官网给出了4个打包 whl 格式的工具:Hatchling、setuptools、Flit、PDM。此处使用的Flit。
- [requires]字段指定了构建系统依赖的包和版本范围。在这里,它要求flit_core包的版本在3.2(包括)和4(不包括)之间。
- [build-backend]这通常意味着你的项目使用flit_core作为构建工具。
- [project] 下的 name 和 version 定义了项目的名称和版本。
- [classifiers]是一个用于描述项目属性的列表,这些属性有助于用户理解项目的用途、兼容性、开发状态等。classifiers是可选的,但为项目添加适当的分类器有助于提高其在Python Package Index (PyPI) 上的可发现性。
- [name]项目名称
- [version]项目版本
- [project.dependencies] 列出了项目的依赖关系。
- [project.optional-dependencies] 列出了可选的依赖集合,例如测试依赖。
- [project.scripts] 和 [project.gui-scripts] 定义了可执行脚本。
二、构建包
安装 build 库
pip install --upgrade build
打包构建
终端里切换到 pyproject.toml 文件所在目录运行
python -m build
等待构建完成,提示 Successfully built 的提示,当前目录即会多出一个 dist 文件夹,里面有两个文件,即是打包好的文件。