打包 Python 项目

本教程将带你一步步打包一个简单的 Python 项目。你将学习如何添加必要的文件和目录结构来创建一个可发布的包,如何构建这个包,并将其上传到 Python Package Index (PyPI)。

部分命令需要较新版本的 pip,因此请先确保你已安装最新版:

# Windows 用户python-m pip install--upgrade pip

一个简单的项目

本教程使用一个名为 example_package_YOUR_USERNAME_HERE 的示例项目。
例如,如果你的用户名是 me,那么包名就是 example_package_me。这样可以确保你的包名是唯一的,不会与其他学习者上传的包冲突。

我们建议你先完整地按照本教程操作一遍这个示例项目,之后再尝试打包自己的项目。
在本地创建如下目录结构:

packaging_tutorial/ └── src/ └── example_package_YOUR_USERNAME_HERE/ ├── __init__.py └── example.py

📌 说明:包含 Python 模块的目录名称应与项目名一致。这不仅简化了配置,也更便于用户理解。

  • init.py 文件的存在使得该目录能被当作一个标准的 Python 包导入(即使它是空的)。
  • example.py 是包中的一个模块,用于存放你的核心逻辑(如函数、类、常量等)。打开它并写入以下内容:
defadd_one(number):returnnumber+1

创建好上述结构后,请确保后续所有命令都在 packaging_tutorial/ 目录下执行。

添加打包所需的文件

接下来,你需要添加一些用于准备发布项目的文件。完成后,项目结构应如下所示:

packaging_tutorial/├── LICENSE ├── pyproject.toml ├── README.md ├── src/│ └── example_package_YOUR_USERNAME_HERE/│ ├── __init__.py │ └── example.py └── tests/
创建测试目录

tests/ 是预留的测试文件目录,目前可以留空。

选择构建后端(Build Backend)

像 pip 和 build 这样的工具本身并不负责将源代码打包成分发格式(例如 wheel 文件),这项工作由 构建后端(build backend) 完成。
构建后端决定了你的项目如何声明元数据(如包名、版本、作者、PyPI 上显示的信息等)以及哪些文件需要被打包。不同的后端功能略有差异(例如是否支持编译 C 扩展模块),你可以根据需求选择合适的工具。
常见的构建后端包括:

  • Hatchling(本教程默认使用)
  • Setuptools
  • Flit
  • PDM
  • uv-build

⚠️ 注意:某些构建工具(如 PDM、Hatch)还提供了额外功能,比如项目初始化、版本管理、上传等。但本教程仅使用独立的、单一用途的工具(如 build 和 twine)。

构建后端的选择通过 pyproject.toml 文件中的 [build-system] 部分指定。以下是几个常见后端的配置示例:

Hatchling(推荐)

[build-system]requires=["hatchling >= 1.26"]build-backend="hatchling.build"

Setuptools

[build-system]requires=["setuptools >= 61.0","wheel"]build-backend="setuptools.build_meta"

🔍 说明:

  • requires 列出了构建包所必需的依赖项(通常包括构建后端本身)。前端工具(如 build)会在隔离环境中自动安装这些依赖。
  • build-backend 指定了用于执行构建的 Python 对象路径。

这两个字段通常由你选择的构建工具文档提供,一般无需手动修改。

配置项目元数据

打开 pyproject.toml,填入以下内容。记得将包名中的 YOUR_USERNAME_HERE 替换为你的实际用户名,以确保唯一性:

[project] name = "example_package_your_username_here" version = "0.0.1" authors = [ { name = "Example Author", email = "author@example.com" }, ] description = "一个简单的示例包" readme = "README.md" requires-python = ">=3.9" classifiers = [ "Programming Language :: Python :: 3", "Operating System :: OS Independent", ] license = { text = "MIT" } license-files = ["LICENSE"] [project.urls] Homepage = "https://github.com/pypa/sampleproject" Issues = "https://github.com/pypa/sampleproject/issues"

字段说明:

  • name:包的分发名称。只能包含字母、数字、.、_、-,且不能与 PyPI 上已有包重名。
  • version:包的版本号(某些后端支持从 Git 标签或文件中自动读取)。
  • authors:作者信息,可包含姓名和邮箱。也可用相同格式列出维护者(maintainers)。
  • description:简短的一句话描述。
  • readme:指向 README 文件的路径,内容会显示在 PyPI 项目页面上。
  • requires-python:指定项目兼容的 Python 版本范围。pip 会据此选择合适的包版本。
  • classifiers:提供额外元数据,帮助用户和索引系统理解你的包。至少应包含 Python 版本和操作系统兼容性。完整分类列表见 PyPI 分类器页面。
  • license:使用 SPDX 许可证标识符(如 “MIT”)。
  • license-files:许可证文件的路径(相对于 pyproject.toml 所在目录)。注意:原文中的 [“LICEN[CS]E*”] 是一种 glob 写法,但为了清晰和兼容性,建议直接写 [“LICENSE”]。
  • urls:可在 PyPI 页面上显示的额外链接,如源码、文档、问题追踪等。

更多字段(如 keywords、dependencies)可参考 pyproject.toml 官方指南。

编写 README.md

创建 README.md 文件,内容如下(可自行修改):

# 示例包这是一个简单的示例包。你可以使用[GitHub 风格的 Markdown](https://guides.github.com/features/mastering-markdown/)来撰写内容。

添加 LICENSE(许可证)

每个上传到 PyPI 的包都必须包含许可证,以告知用户他们可以如何使用你的代码。
推荐访问 choosealicense.com 选择合适的许可证。例如,选择 MIT 许可证,则 LICENSE 文件内容如下:

Copyright (c) 2026 Your Name Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

✅ 大多数现代构建后端会自动将 LICENSE 文件包含进最终的分发包中,前提是它在 license-files 中正确声明。

生成分发包(Distribution Archives)

下一步是生成可上传到 PyPI 的分发包。这些包可以被 pip 安装。
首先确保已安装最新版的 build 工具:

# Windowspython-m pip install--upgrade build

然后在 pyproject.toml 所在目录运行:

# Windowspython-m build

成功后,会在 dist/ 目录下生成两个文件:

dist/ ├── example_package_your_username-0.0.1-py3-none-any.whl └── example_package_your_username-0.0.1.tar.gz
  • .tar.gz 是 源码分发包(source distribution)
  • .whl 是 构建好的 wheel 包(built distribution)

📦 现代 pip 优先安装 wheel 包,若不可用则回退到源码包。建议始终同时提供源码包和适用于目标平台的 wheel 包。本例中包是纯 Python 且跨平台,因此只需一个 wheel。

上传到 PyPI

现在,将你的包上传到 TestPyPI(PyPI 的测试环境,专用于实验,不会影响正式索引)。

步骤 1:注册 TestPyPI 账号

前往 https://test.pypi.org/account/register/ 注册账号,并验证邮箱。

步骤 2:创建 API Token

登录后,进入 API Tokens 页面,创建一个作用域为 “Entire account” 的 Token。务必在关闭页面前复制保存——你之后无法再次查看明文 Token

步骤 3:使用 Twine 上传

安装 twine:

# Windowspy-m pip install--upgrade twine

上传所有分发包:

# Windowspy-m twine upload--repository testpypi dist/*

系统会提示你输入 API Token(格式如 pypi-xxxxx),粘贴即可(输入时不可见,请确保准确)。
成功后,你会看到类似输出:

Uploading example_package_your_username_here-0.0.1-py3-none-any.whl 100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.2/8.2 kB • 00:01 • ? Uploading example_package_your_username_here-0.0.1.tar.gz 100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.8/6.8 kB • 00:00 • ?

上传完成后,你的包将在 TestPyPI 上可见。

安装并测试你的包

使用 pip 从 TestPyPI 安装你的包进行验证:

# Windowspy-m pip install--index-url https://test.pypi.org/simple/--no-deps example-package-your-username

🔒 注意:

  • 使用 --index-url 指定 TestPyPI;
  • 使用 --no-deps 避免因 TestPyPI 缺少依赖而导致安装失败(虽然本例无依赖,但这是良好实践)。

安装成功后,启动 Python 并测试:

fromexample_package_your_usernameimportexampleprint(example.add_one(2))# 输出:3

下一步

🎉 恭喜!你已经成功打包并发布了你的第一个 Python 项目!
接下来,你可以:

  • 将真实项目按此流程打包;
  • 添加单元测试(放入 tests/);
  • 配置 CI/CD 自动构建和发布;
  • 上传到正式 PyPI(需注册 pypi.org 账号)。

祝你打包顺利!✨🍰✨

参考文献

https://packaging.python.org/en/latest/tutorials/packaging-projects/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搞定提示工程优化文本生成

💓 博客主页:借口的CSDN主页 ⏩ 文章专栏:《热点资讯》 提示工程的优化艺术:从理论到高效文本生成的实践指南目录提示工程的优化艺术:从理论到高效文本生成的实践指南 引言:提示工程的核心价值与时代挑战 一…

尺寸约束下商业卫星编码器系统的抗辐照MCU性能边界研究

摘要:随着低轨商业卫星星座的规模化部署,星载编码器系统对抗辐照微控制器单元(MCU)的性能、体积及成本提出了严苛的多重要求。本文基于国科安芯AS32S601系列MCU的完整辐照试验数据体系,系统性地研究在LQFP144塑封封装所…

AI原生应用可解释性:如何说服利益相关者?

AI原生应用可解释性:从技术落地到利益相关者说服的全维指南 关键词 AI可解释性(XAI)、利益相关者沟通、决策透明度、信任构建、合规性工程、可解释性成熟度模型、多模态解释框架 摘要 本报告系统解析AI原生应用可解释性的核心机制与利益相关者…

无人驾驶物流车网关的多路CANFD冗余架构与通信可靠性分析

摘要:随着L4级自动驾驶技术在末端物流场景的规模化部署,无人驾驶物流车对车载网关系统的实时性、可靠性与功能安全性提出了前所未有的严苛要求。控制器局域网络灵活数据率(CANFD)协议作为新一代车载通信标准,在兼容传统…

json库使用教程

json库 json库通常用于解析json文件以及生成json文件,通常读入json文件需要伴随着文件的打开模式 前置学习-文件打开模式 r 代表只读模式 w 可写 r+ 可读可写,文件必须存在,才能读写 w+ 可读可写,文件不存在时,会…

西门子PLC S7-1200实现4ms精准周期数据采集(带时间戳)

一、前言工业自动化数据高速采集一直是行业内一大难题与痛点。高速数据采集要保证速度,也要保证时刻的准确性。而在windows系统平台下,时间稳定性是个很难的问题。PLC-Recorder通过不断升级迭代,程序内部架构优化,…

2026.1.15总结

了解机器学习基础内容和scikit-learn 2. 机器学习基础 # scikit-learn 入门 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import Logis…

2026年普通人有什么机会?

宗旨: 1、最好能有长期发展。 2、不触及法律法规。 3、成本低,收益递增。 方向: 符合社会发展的大潮流。类似雷军当年看到手机的发展。 具体内容: AI带来的社会变革。普通人拥抱AI,利用AI带来的社会变革趋势。 …

Linux操作系统(1)

前引:在Linux系统的高并发领域,I/O处理效率直接决定了服务的性能上限。当我们面对每秒数万甚至数十万的连接请求时,传统的“一连接一线程”模型会因线程切换开销暴增而迅速崩溃,而早期的I/O多路转接技术如select和poll&#xff0c…

Linux操作系统(3)

前引:在Linux系统的高并发领域,I/O处理效率直接决定了服务的性能上限。当我们面对每秒数万甚至数十万的连接请求时,传统的“一连接一线程”模型会因线程切换开销暴增而迅速崩溃,而早期的I/O多路转接技术如select和poll&#xff0c…

<Linux基础第5集>关于apt命令的细节

零 先看目录 紧接上一集Linux命令 apt update 与 apt upgrade apt update # 更新本地软件源仓库 # 刷新一下软件商店 apt upgrade # 把所有软件包都更新到最新版本 # 更具本地软件商店,把系统下载的软件全部更新到最新版本 # 一般先执行apt update,在执行pat upgrade apt insta…

Linux操作系统(2)

前引:在Linux系统的高并发领域,I/O处理效率直接决定了服务的性能上限。当我们面对每秒数万甚至数十万的连接请求时,传统的“一连接一线程”模型会因线程切换开销暴增而迅速崩溃,而早期的I/O多路转接技术如select和poll&#xff0c…

11-3 register integration

文章目录 原始代码 详细解读:Direct vs Layered UVM验证框架 一、第一段代码(Direct框架)详细解读 1. APB从设备模块(slave) 2. 寄存器模型(dut_regmodel) 3. 测试平台(tb_top) 4. 测试环境(tb_env)关键代码 二、第二段代码(Layered框架)详细解读 1. APB从设备模块…

智能驾驶三剑客:NDS、KIWI与ADASIS

NDS、KIWI 和 ADASIS 是智能驾驶与高精度地图领域中三个关键的技术标准或协议,分别服务于导航数据格式标准化、嵌入式地图数据存储和高级驾驶辅助系统(ADAS)与地图之间的信息交互。下面分别对它们进行简明扼要的解释,并说明三者之…

day147—递归—二叉树的最近公共祖先(LeetCode-236)

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以…

题解:P9353 [JOI 2023 Final] 现代机器 / Modern Machine

感觉很好的题啊。 题意:感觉总结不是很总结地明白,直接看题面吧。 Bitaro 收到了一个 JOI 机器作为生日礼物。 JOI 机器由一个球、\(N\) 个灯光瓷砖和 \(M\) 个按钮组成。灯光瓷砖从 \(1\) 到 \(N\) 编号。当 Bitaro…

12款论文AI工具横向对比:数学建模论文复现效率提升与格式优化方法

还在为论文写作头痛?特别是数学建模的优秀论文复现与排版,时间紧、任务重,AI工具能帮上大忙吗?今天,我们评测10款热门AI论文写作工具,帮你精准筛选最适合的助手。 aibiye:专注于语法润色与结构…

12款论文AI工具横向对比:数学建模论文复现效率提升与格式优化方法

还在为论文写作头痛?特别是数学建模的优秀论文复现与排版,时间紧、任务重,AI工具能帮上大忙吗?今天,我们评测10款热门AI论文写作工具,帮你精准筛选最适合的助手。 aibiye:专注于语法润色与结构…

12款AI论文工具深度分析:数学建模论文快速复现与格式精准调整方案

还在为论文写作头痛?特别是数学建模的优秀论文复现与排版,时间紧、任务重,AI工具能帮上大忙吗?今天,我们评测10款热门AI论文写作工具,帮你精准筛选最适合的助手。 aibiye:专注于语法润色与结构优…

12款AI论文工具深度分析:数学建模论文快速复现与格式精准调整方案

还在为论文写作头痛?特别是数学建模的优秀论文复现与排版,时间紧、任务重,AI工具能帮上大忙吗?今天,我们评测10款热门AI论文写作工具,帮你精准筛选最适合的助手。 aibiye:专注于语法润色与结构优…