将 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总是要参考非常多的资料, 我参考的主要资料如下:

posted @ 2024-11-29 17:37  Zheng-Bicheng  阅读(172)  评论(0)    收藏  举报