用途
python-packaging 面向 Python 库与 CLI 工具的打包、构建与分发。资料列出的触发场景包括:为分发创建 Python 库;构建带入口点的 CLI 工具;发布到 PyPI 或私有仓库;搭建 Python 项目结构(src 布局或扁平布局);配置 pyproject.toml、setup.py 或 setup.cfg;构建 wheel 与源码分发(sdist);对 Python 包进行版本管理与发布;创建命名空间包或多包项目。
核心概念
包结构:推荐源布局 src/package_name/,也有扁平布局 package_name/(更简单但灵活性较低)。包元数据可写在 pyproject.toml、setup.py 或 setup.cfg 中。分发格式为 wheel(.whl)与源码分发(.tar.gz)。
现代打包标准:PEP 517/518(构建系统要求)、PEP 621(pyproject.toml 中的元数据)、PEP 660(可编辑安装)。pyproject.toml 作为单一配置来源。
构建后端:setuptools(传统、使用广泛)、hatchling(现代、有主张)、flit(轻量、面向纯 Python)、poetry(依赖管理 + 打包)。
分发渠道:PyPI(公开)、TestPyPI(生产前测试)、私有仓库(JFrog、AWS CodeArtifact 等)。
主要能力与配置
资料给出最小包结构示例(包含 pyproject.toml、README.md、LICENSE、src/my_package/ 与 tests/),以及最小 pyproject.toml 示例,其中包含 [build-system](requires、build-backend)、[project](name、version、description、authors、readme、requires-python、dependencies)与 [project.optional-dependencies](dev 组,如 pytest、black)。
源布局配置为: [tool.setuptools.packages.find] where = ["src"]
资料还给出源布局、扁平布局与多包项目的目录结构模式,并说明源布局的优点:防止从源码意外导入、测试导入更干净、隔离性更好;扁平布局更简单但可能在未安装时导入包。
动态版本配置使用 setuptools-scm,[project] 中声明 dynamic = ["version"],并通过 [tool.setuptools.dynamic] version = {attr = "my_package.version"} 指定;init.py 中可写 version = "1.0.0",或使用 importlib.metadata 的 version("my-package")。
使用方式:构建与发布
构建:先安装 pip install build twine,然后执行 python -m build 构建分发,再用 twine check dist/* 校验。
发布:先在 TestPyPI 测试 twine upload --repository testpypi dist/,用 pip install --index-url https://test.pypi.org/simple/ my-package 验证安装,再执行 twine upload dist/ 发布到 PyPI。推荐使用 API token,并给出 ~/.pypirc 的示例配置(pypi 与 testpypi 两个 index-servers,username = token,password 为 token)。
安装测试:可编辑安装 pip install -e .、pip install -e ".[dev]"、pip install -e ".[dev,docs]";也可在隔离环境中创建 venv、安装构建出的 wheel、运行 python -c "import my_package; print(my_package.version)" 与 my-tool --help 验证,然后退出并删除该环境。
依赖版本约束示例:requests>=2.28.0,<3.0.0(兼容范围)、click~=8.1.0(兼容发布,>=8.1.0,<8.2.0)、pydantic>=2.0(最低版本)、numpy==1.24.3(精确版本,尽量避免)。
适用场景
需要将 Python 库或命令工具构建为 wheel/sdist 并分发;需要选择项目布局、配置元数据、设置动态版本;需要先在 TestPyPI 验证再发布 PyPI;需要离线或隔离环境验证安装;需要为多包项目或命名空间包规划结构。
最佳实践(来自资料)
使用 src/ 布局;使用 pyproject.toml 进行现代打包;在 build-system.requires 中固定构建依赖;采用语义化版本;包含完整元数据(classifiers、URLs 等);在干净环境中测试安装;发布 PyPI 前先用 TestPyPI;用 README 与 docstring 充分文档化;包含 LICENSE 文件;用 CI/CD 自动化发布。
发布检查清单:代码已测试(pytest 通过);文档完整(README、docstring);版本号已更新;CHANGELOG.md 已更新;包含 License 文件;pyproject.toml 完整;包可无错误构建;已在干净环境测试安装;CLI 工具可用(如适用);PyPI 元数据正确(classifiers、keywords);已关联 GitHub 仓库;先在 TestPyPI 测试;为发布创建 Git tag。
参考与资源
资料提供 references/packaging-guide.md,包含完整功能的 pyproject.toml 示例与全部工具配置、CLI 模式(Click 与 argparse)、GitHub Actions 的 CI/CD 发布、多架构 wheel、数据文件、命名空间包、C 扩展、基于 git 的版本管理、私有包索引,以及文件模板(.gitignore、MANIFEST.in、README.md)。
资源链接:Python Packaging Guide(https://packaging.python.org/)、PyPI(https://pypi.org/)、TestPyPI(https://test.pypi.org/)、setuptools 文档(https://setuptools.pypa.io/)、build(https://pypa-build.readthedocs.io/)、twine(https://twine.readthedocs.io/)。
限制
资料未说明该技能的收费、价格、具体平台支持范围或实际使用效果,这些信息暂未提供。