将 Paddle2ONNX 的项目构建方式从 setup.py 迁移到 pyproject.toml
1 简介
在软件开发中, 项目构建方式的选择对项目的可维护性, 可扩展性及与其他工具的兼容性至关重要. 随着 Python 生态系统的进步, 使用 pyproject.toml 文件管理项目依赖和构建配置成为一种新兴趋势. 相较于 setup.py, pyproject.toml 采用 TOML 语法, 简化配置文件读写; 提供灵活依赖管理, 不依赖特定构建工具; 支持丰富构建配置, 使构建过程更透明, 可定制。
2 实现过程
2.1 迁移对项目属性信息的配置
将 Paddle2ONNX 的版本信息配置全部迁移到 pyproject.toml 中实现, setup.py 仅用于执行 CMake 编译操作。因此在 setup.py 中删除除项目属性定义操作, 然后在 pyproject.toml 中添加如下配置:
# 配置项目依赖项
requires = [
"setuptools>=42",
"wheel",
"cmake>=3.16",
"setuptools-scm"
]
build-backend = "setuptools.build_meta"
# 定义项目属性
[project]
name = "paddle2onnx"
description = "Export PaddlePaddle to ONNX"
readme = "README.md"
authors = [
{name = "paddle-infer", email = "paddle-infer@baidu.com"},
]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
]
license = {text = "Apache License v2.0"}
requires-python = ">=3.8"
2.2 迁移对项目版本的配置
特别注意的是, Paddle2ONNX 之前的构建方式参考 ONNX 来实现, 版本控制这个环节是在 setup.py 中手动编写代码实现的, 删除过后我们需要用现代的方法替换掉他:
# 定义项目属性
[project]
dynamic = ["version"]
[tool.setuptools.dynamic]
version = {file = "VERSION_NUMBER"}
[tool.setuptools_scm]
write_to = "paddle2onnx/version.py"
随后在 paddle2onnx/init.py 文件中删除掉对和 git_version 有关的变量, 仅保留 version, 原因是 git_version 已经被整合到了 version 中
from paddle2onnx.utils import logging
from . import command
from .convert import dygraph2onnx
from .convert import program2onnx
from .version import version
__version__ = version
2.3 删除requirement.txt
我们希望实现通过pyproject.toml实现对整个依赖关系的清晰构建, 因此删除了requirement.txt, 改为在pyproject.toml中添加如下配置:
[project]
dependencies = [
"onnxruntime>=1.10.0",
]
当然, 你也可以参考onnx的实现方式, 用一种取巧的办法
[project]
dynamic = ["dependencies"]
[tool.setuptools.dynamic]
dependencies = {file = "requirements.txt"}
2.4 迁移命令行入口
删除 setup.py 对命令行入口的配置, 在 pyproject.toml 中添加如下配置:
[project.scripts]
paddle2onnx = "paddle2onnx.command:main"
2.5 迁移find_packages操作
原 setup.py 中该操作通过 setuptools.find_packages() 来完成, 迁移过后在 pyproject.toml 中添加如下配置:
[tool.setuptools.packages.find]
include = ["paddle2onnx*"]
2.6 其他的一些额外操作
参考了 pybind 给出的 cmake_demo, 额外添加了如下配置:
[tool.mypy]
files = "setup.py"
python_version = "3.8"
strict = true
show_error_codes = true
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
warn_unreachable = true
2.7 添加 MANIFEST.in
MANIFEST.in 在编译时会拷贝所有的依赖文件, 因此将编译需要依赖的文件写到这个文件中, 具体如下:
recursive-include cmake *
recursive-include paddle2onnx *
recursive-include third_party *
recursive-include tools *
include LICENSE
include VERSION_NUMBER
include CMakeLists.txt
3 参考资料
提交一个PR总是要参考非常多的资料, 我参考的主要资料如下:
- [Build][Update] Update the project’s build process to pyproject. by Zheng-Bicheng · Pull Request #1221 · PaddlePaddle/Paddle2ONNX
- GitHub - pybind/cmake_example: Example pybind11 module built with a CMake-based build system
- GitHub - onnx/onnx: Open standard for machine learning interoperability
- GitHub - jzhang533/randomfun
- Configuring setuptools using pyproject.toml files - setuptools 69.2.0.post20240313 documentation
- GitHub - pypa/setuptools_scm: the blessed package to manage your versions by scm tags
- 基于pyproject.toml的包管理(setuptools)
- Python - 如何打包并发布 Python 库到 PyPI

浙公网安备 33010602011771号