将python代码、文件、数据打成一个whl包,可以直接pip 安装到系统中,有两种方法:(1)setup.py;(2)pyproject.toml
1. 使用setup.py
bash
├── CHANGELOG.md
├── README.md
├── build
│ ├── bdist.linux-x86_64
│ └── lib
├── ci.yml
├── dist
│ └── nvidia_modelopt-0.0.0-py3-none-any.whl
├── modelopt
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── __pycache__
│ ├── deploy
│ ├── onnx
│ └── torch
├── nvidia_modelopt.egg-info
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ ├── dependency_links.txt
│ ├── requires.txt
│ └── top_level.txt
├── setup.py
└── test.py
python
from setuptools import setup, find_packages
setup(
name="nvidia-modelopt",
packages=find_packages(),
install_requires=["torch"],
include_package_data=True,
package_data={
"modelopt": ["modelopt", "*", "**/*"],
},
extras_require={
"torch": ["torch"],
},
description="modelopt for guanxing"
)
直接运行 python setup.py bdist_wheel 打包文件
2. 使用 pyproject.toml
bash
my_package_demo/
├── pyproject.toml
├── README.md
├── src/
│ └── my_package/
│ ├── __init__.py
│ └── core.py
├── tests/
│ └── test_core.py
└── data/
└── sample_data.txt
python
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "my-package-demo"
version = "0.1.0"
description = "A demo Python package."
readme = "README.md"
authors = [
{ name = "Your Name", email = "you@example.com" }
]
requires-python = ">=3.7"
dependencies = []
[tool.hatch.build.targets.wheel]
# 明确指定要打包的包目录(src模式)
packages = ["src/my_package"]
# 如要包含额外的数据文件(可选)
include = [
"src/my_package/**.py",
"data/sample_data.txt"
]
[tool.hatch.build.targets.wheel].packages
指定只打包src/my_package
下的包,不含其它目录。include
显式指定只包含src/my_package
目录下的.py
文件和data/sample_data.txt
数据文件,可精准控制(若只要包本身,可以省略或只写包目录)。
如果使用setuptools,可以这样写:
bash
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "my-package-demo"
version = "0.1.0"
description = "A demo Python package."
readme = "README.md"
requires-python = ">=3.7"
[tool.setuptools]
package-dir = { "" = "src" }
packages = ["my_package"]
include-package-data = true
[tool.setuptools.package-data]
my_package = ["../data/sample_data.txt"] # 注意路径调整
# 或者只包含py文件
# my_package = ["*.py"]
bash
pip install build
python -m build
附一个比较全的pyproject.toml模版
bash
# 构建系统配置
# PEP 517 规定的构建系统配置,指定构建工具和后端
[build-system]
# 构建时需要的依赖
requires = ["hatchling"]
# 构建后端,使用 hatchling 替代传统的 setuptools
build-backend = "hatchling.build"
# 项目元数据配置
# PEP 621 规定的项目核心元数据
[project]
# 项目名称,将用于发布和安装
name = "nvidia-modelopt"
# 项目版本,1.0.0 以上版本被视为正式发布版本
version = "0.1.0"
# 项目简介,不支持非英文字符
description = "Hello world"
# README 文件路径,用于生成长描述
readme = "README.md"
# Python 版本要求
requires-python = ">=3.10"
# 许可证信息
license = { text = "MIT" }
# 作者信息列表
authors = [
{ name = "xxx", email = "xxx" }
]
# 关键词,用于包索引和搜索
keywords = ["xx", "yy"]
# 项目分类,用于 PyPI 分类(如果项目不打算开源可以忽略)
# 完整分类列表:https://pypi.org/pypi?%3Aaction=list_classifiers
classifiers = [
"Private :: Do Not Upload",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10"
]
# 项目依赖列表
dependencies = [
"build>=1.0.3"
]
# 可选依赖配置,可通过 pip install package[test] 安装
[project.optional-dependencies]
# 测试相关依赖
test = [
"pytest",
"mock"
]
# 项目相关 URL 配置
[project.urls]
# 项目主页,通常是项目的 icode 地址
Homepage = "http:xxxx"
# 更新日志文件链接
Changelog = "CHANGELOG.md"
# 命令行入口点配置
[project.scripts]
# 格式:命令名 = 模块路径:函数名
modelopt = "modelopt.cmdline:main"
# Hatch 构建工具配置
[tool.hatch.build]
# 要包含的 Python 包
packages = ["modelopt"]
# 要包含的数据文件
# 支持通配符模式
# "modelopt": ["modelopt", "*", "**/*"],
include = [
"modelopt",
"modelopt/*"
]
# wheel 包构建配置
[tool.hatch.build.targets.wheel]
# 指定要打包的 Python 包
packages = ["modelopt"]
# wheel 包输出目录
output-dir = "output/dist"
# 源码包构建配置
[tool.hatch.build.targets.sdist]
# 源码包输出目录
output-dir = "output/dist"