如何打包你的 Python 项目?setuptools 与 wheel

答案:Python项目打包需用pyproject.toml定义元数据和依赖,结合setuptools生成wheel包,实现代码分发、依赖管理与跨环境部署,提升可维护性和协作效率。

如何打包你的 python 项目?setuptools 与 wheel

打包Python项目,核心在于将其代码、依赖和元数据组织成一个可分发的格式,最常见的就是使用

setuptools

来定义项目结构,并通过它生成

wheel

格式的二进制分发包(以及

sdist

源码分发包),以便其他人或系统能轻松安装和使用。这不仅仅是了上传到PyPI,更是为了项目自身的模块化、可维护性和协作效率。

解决方案

说实话,刚开始接触Python打包时,我个人觉得这玩意儿有点玄乎,各种配置文件和概念堆在一起。但一旦你理解了核心逻辑,它其实非常直观。现代Python项目的打包流程,强烈推荐使用

pyproject.toml

结合

build

工具

项目结构准备:一个典型的、推荐的项目结构会是这样:

my_project/├── src/│   └── my_package/│       ├── __init__.py│       └── module_a.py├── pyproject.toml├── README.md├── LICENSE├── requirements.txt (可选,用于开发环境)└── .gitignore

这里

src/

目录非常关键,它将你的包代码与项目根目录下的其他文件(如文档、测试、配置文件)清晰地分离。这避免了在开发模式下Python解释器意外地从项目根目录加载包的问题。

pyproject.toml

文件配置:这是你的项目元数据和构建系统定义的核心文件。它遵循TOML格式,比传统的

setup.py

更声明式,更易于理解和维护。

[build-system]requires = ["setuptools>=61.0", "wheel"]build-backend = "setuptools.build_meta"[project]name = "my-awesome-package"version = "0.1.0"description = "一个超棒的Python项目,解决你的所有烦恼。"readme = "README.md"requires-python = ">=3.8"license = { file = "LICENSE" }keywords = ["awesome", "utility", "python"]authors = [    { name = "你的名字", email = "你的邮箱@example.com" },]maintainers = [    { name = "另一个贡献者", email = "另一个邮箱@example.com" },]classifiers = [    "Programming Language :: Python :: 3",    "License :: OSI Approved :: MIT License",    "Operating System :: OS Independent",]dependencies = [    "requests>=2.28.1",    "numpy",    # 更多依赖...][project.urls]"Homepage" = "https://github.com/你的用户名/my_project""Bug Tracker" = "https://github.com/你的用户名/my_project/issues""Documentation" = "https://my_project.readthedocs.io/"[tool.setuptools.packages.find]where = ["src"] # 告诉setuptools在src目录下查找包

这里我们定义了构建系统(使用

setuptools

作为后端),然后是项目的基本信息、依赖、作者、许可证等。

[tool.setuptools.packages.find]

部分是告诉

setuptools

src

目录下找你的Python包。

立即学习“Python免费学习笔记(深入)”;

安装构建工具:你需要安装

build

工具来执行打包操作。

pip install build

执行打包:在你的项目根目录(

pyproject.toml

所在的目录)下运行:

python -m build

这个命令会执行构建过程,通常会在项目根目录下生成一个

dist/

目录。里面会包含两个文件:

my_awesome_package-0.1.0-py3-none-any.whl

(Wheel 文件,二进制分发包)

my_awesome_package-0.1.0.tar.gz

(Source Distribution,源码分发包)

现在,你就可以用

pip install dist/my_awesome_package-0.1.0-py3-none-any.whl

来安装你的包了,或者将其上传到PyPI。

为什么我的Python项目需要打包?

老实说,一开始我只是写脚本,本地跑跑,根本没想过打包这回事。但随着项目代码量上去,或者需要给别人用,甚至只是自己换台机器部署,就会发现不打包简直是自找麻烦。

核心原因在于:可重复性、可维护性和协作效率。

想想看,如果你写了一个工具,里面用到了

requests

pandas

这些库。如果只是把代码文件扔给别人,他们怎么知道要安装哪些依赖?版本对不对?打包就解决了这个问题。它把你的代码、依赖信息、版本号、作者、许可证等所有元数据都封装在一起,形成一个标准的、可安装的单元。

对于个人项目,打包意味着你可以轻松地在不同环境(比如开发机、测试服务器、生产环境)部署你的代码,确保依赖的一致性。对于团队协作,它提供了一个清晰的接口,让团队成员能够像使用任何第三方库一样使用你开发的模块,而不需要深入了解其内部结构。更重要的是,它为你的项目走向公开(比如发布到PyPI)铺平了道路,让全世界都能轻松地使用你的劳动成果。这不仅仅是技术上的必要,更是一种代码工程化和专业化的体现。

setuptools

wheel

:它们到底是什么关系?

理解

setuptools

wheel

的关系,就好比理解建筑师和预制板的关系。

setuptools

,你可以把它看作是项目的“建筑师”和“施工方”。它定义了你的项目应该如何被构建。它负责:

元数据管理:读取

pyproject.toml

(或

setup.py

)中定义的项目名称、版本、作者、依赖等信息。包发现:根据你的配置(比如

where = ["src"]

),找到项目中实际的Python模块和包。资源包含:确保像配置文件、数据文件等非Python代码也能被打包进去。依赖解析:处理你项目所依赖的其他库。构建指令:最终,它会执行一系列操作,将你的源代码和所有相关信息转换成可分发的格式。

简单来说,

setuptools

是那个知道如何把你的散乱代码和配置变成一个有组织的、可安装的“东西”的引擎。

wheel

,则是这个“东西”的最终“预制件”。它是一种二进制分发格式。想象一下,如果

setuptools

把你的项目“盖”好了,那么

wheel

就是那个已经打包好的、可以直接搬到工地上(你的Python环境里)安装的“预制房屋”。

它的特点是:

预编译:如果你的项目包含C扩展(例如

numpy

),

wheel

文件通常会包含这些预编译好的二进制文件,省去了用户在安装时进行编译的步骤,大大加快了安装速度。平台特定:一个

wheel

文件可能只适用于特定的Python版本和操作系统架构(尽管很多纯Python包是

any

,即通用)。安装快速

pip

可以直接解压

wheel

文件并将其内容放置到正确的位置,无需执行任何构建步骤。

所以,它们的关系是:

setuptools

(作为构建后端)使用

wheel

格式来生成最终的可分发包。

setuptools

负责“制造”这个“预制件”,而

wheel

本身就是这个“预制件”的标准格式。当你运行

python -m build

时,

setuptools

会按照

pyproject.toml

的指示,最终输出

.whl

(以及

.tar.gz

)文件。

pyproject.toml

vs

setup.py

:我该选择哪一个?

这个问题,在我看来,几乎没有争议:强烈推荐使用

pyproject.toml

过去,

setup.py

是Python项目打包的黄金标准。它是一个Python脚本,这意味着你可以用Python的全部灵活性来定义你的打包逻辑。你可以编写复杂的条件语句,动态地生成元数据,或者执行一些自定义的构建步骤。

# 示例:setup.py (不推荐,但了解一下)from setuptools import setup, find_packagessetup(    name="my_legacy_package",    version="0.1.0",    packages=find_packages(where="src"),    package_dir={"": "src"},    install_requires=[        "requests>=2.28.1",        "numpy",    ],    # ... 更多配置)

然而,这种灵活性也带来了问题。

setup.py

需要被执行才能获取到项目的元数据,这使得工具链(比如

pip

)在处理它时变得复杂。它可能引入副作用,或者依赖于特定的Python环境才能正确运行。这导致了所谓的“构建隔离”问题,即构建工具本身可能需要依赖项目本身的依赖才能运行,形成循环依赖。

pyproject.toml

,则是Python打包生态系统迈向现代化的关键一步(通过PEP 517和PEP 518)。它是一个声明式的配置文件,用TOML格式编写。这意味着:

元数据是静态的:工具可以在不执行任何Python代码的情况下,直接解析

pyproject.toml

来获取项目的元数据。这大大简化了构建工具的工作。构建系统隔离

pyproject.toml

明确定义了构建项目所需的工具(如

setuptools

wheel

),这些工具会在一个隔离的环境中安装和运行,避免了与项目运行时依赖的冲突。标准化:它提供了一个统一的入口点,不仅

setuptools

可以使用,像

Poetry

Flit

这样的替代构建工具也可以使用。更清晰:TOML格式本身就比Python脚本更适合表达配置,结构清晰,易于阅读和维护。

尽管

setup.py

仍然被大量遗留项目使用,并且在某些极度复杂的定制化构建场景下可能仍有其用武之地,但对于绝大多数新项目和现有项目的迁移,

pyproject.toml

都是毫无疑问的最佳选择。它代表了Python打包的未来,提供了更健壮、更可预测、更易于管理的构建体验。我的建议是,从一开始就拥抱

pyproject.toml

,你会省去很多不必要的麻烦。

以上就是如何打包你的 Python 项目?setuptools 与 wheel的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369728.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
is和==在Python中有什么区别?
上一篇 2025年12月14日 09:54:51
什么是Python的wheel包?
下一篇 2025年12月14日 09:55:08

相关推荐

  • 豆包和deepseek的差距

    豆包和 DeepSee 的主要差距在于用途、规模和复杂性。用途方面,豆包用于数据传输,DeepSee 用于大数据分析。规模方面,豆包处理少量数据,DeepSee 处理海量数据集。复杂性方面,豆包易于使用,DeepSee 需要高级技术技能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无…

    2026年8月31日
    000
  • MySQL事务锁机制对性能影响_MySQL死锁预防和处理技巧

    MySQL事务锁机制对性能影响_MySQL死锁预防和处理技巧MySQL事务锁机制对性能影响_MySQL死锁预防和处理技巧MySQL事务锁机制对性能影响_MySQL死锁预防和处理技巧MySQL事务锁机制对性能影响_MySQL死锁预防和处理技巧

    mysql的事务锁机制是为保证数据一致性与完整性,通过锁定资源避免并发冲突。其对性能的影响主要体现在阻塞、死锁及锁开销。解决死锁的核心策略包括:1.缩短事务生命周期,减少锁持有时间;2.统一资源访问顺序,打破循环依赖;3.优化sql与索引,缩小锁范围;4.分批次处理大数据操作;5.谨慎调整事务隔离级…

    2026年8月31日 用户投稿
    000
  • 百度搜索 10 年来最大改版,首次支持超千字文本输入

    7 月 2 日消息,在今天的百度 ai day 活动中,百度搜索宣布了近十年来最大规模的界面改版。 百度搜索框现已升级为“智能输入框”,可支持超过千字的文本输入,并在拍照、语音、视频等功能上进行了全面增强,同时还能直接调用 AI 写作、AI 绘图等工具。 据百度方面介绍,搜索框的这一变化背后,是百度…

    2026年8月31日
    500
  • ​​电脑风扇噪音大怎么办?降噪解决方法​​

    电脑风扇噪音大通常由灰尘堆积、风扇老化或负载过高引起,解决方法包括:1. 清洁灰尘,使用压缩空气和软刷清理散热片与风扇,注意固定叶片防止空转损坏;2. 更换老化风扇,尤其是轴承磨损后需更换cpu、显卡或机箱风扇,笔记本建议专业人士操作;3. 重新涂抹导热硅脂,清除旧硅脂并均匀涂抹新硅脂以提升散热效率…

    2026年8月31日
    100
  • 夸克的神秘电影入口 夸克浏览器进入私人影院入口

    夸克浏览器作为一款以极简设计和智能搜索为核心的次世代工具,早已超越了传统浏览器的范畴。它不仅仅是信息获取的窗口,更凭借其强大的内核与集成的多功能模块,为用户悄然构建了一个专属的私人影院。在这个空间里,用户可以摆脱繁杂广告的干扰,通过其独特的智能检索技术,高效触达全网海量的影视资源,享受沉浸式、纯净且…

    2026年8月31日
    000
  • 荣耀 MWC 2024 展区体验:开启 AI 终端时代

    在今年的mwc上,荣耀设立了专门的展区,主题主要聚焦在ai终端。利用magicos 8.0,荣耀成功实现了跨设备的协同办公,并在其硬件产品中加入了多项ai相关功能。 在荣耀展区,他们精心邀请了一位芭蕾舞者,她翩翩起舞的同时,荣耀 Magic 6 Pro手机也在一旁展示其强大的抓拍能力。通过AI算法的…

    2026年8月31日
    000
  • 如何优雅的使用和理解线程池

    如何优雅的使用和理解线程池如何优雅的使用和理解线程池如何优雅的使用和理解线程池如何优雅的使用和理解线程池

    前言 平时接触过多线程开发的童鞋应该都或多或少了解过线程池,之前发布的《阿里巴巴 java 手册》里也有一条: 可见线程池的重要性。 简单来说使用线程池有以下几个目的: 线程是稀缺资源,不能频繁的创建。解耦作用;线程的创建于执行完全分开,方便维护。应当将其放入一个池子中,可以给其他任务进行复用。线程…

    2026年8月31日 用户投稿
    000
  • Soul聊天记录丢失怎么找回_Soul聊天记录恢复方法

    聊天记录丢失可尝试四种恢复方法:首先检查云端备份,登录账号后在设置中查找“从云端恢复聊天记录”选项并还原;其次查看设备本地缓存,通过应用存储管理寻找可导出的数据,配合第三方工具解析;若因登录异常导致记录未加载,可退出账号重新登录并刷新界面;最后若自助无效,可通过“帮助与反馈”联系官方客服,提交问题详…

    2026年8月31日
    000
  • JavaScript forEach异步操作如何同步化?

    JavaScript forEach 异步操作的同步化处理详解 forEach 方法用于遍历 JavaScript 数组,其默认行为是同步执行。然而,当 forEach 循环体内部包含异步操作(例如 Promise)时,其执行顺序便不再同步。 文章中提到的代码片段试图通过 async/await 来…

    2026年8月31日
    000
  • Android开发中,responseData.data数组返回null值,如何正确解析嵌套JSON数据?

    Android开发:解析嵌套JSON数据及responseData.data数组返回null的解决方法 Android应用开发中,服务器返回的JSON数据常常包含复杂的嵌套结构。例如,responseData包含一个data字段,而data字段的值是一个JSON对象数组。本文探讨一个常见问题:res…

    2026年8月31日
    000
  • 台湾AI伺服器厂商赴美生产,鸿海、广达等布局德州

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 受美国关税政策影响,台湾多家AI服务器厂商正加速在美国建厂,其中德州成为首选之地。鸿海、广达、维创、英业达和仁宝等企业均已将德州列为优先投资地点。据悉,电电公会近期已带领七家AI服务器厂商赴美考…

    2026年8月31日
    500
  • Java Optional.filter方法使用技巧

    Optional.filter用于条件筛选,值存在且满足条件时返回原值封装,否则返回空;可与map等链式调用,实现安全简洁的嵌套数据提取与校验。 Java 中的 Optional.filter 方法是一个非常实用的工具,用于在不破坏 Optional 封装的前提下,对内部值进行条件判断。如果值存在且…

    2026年8月31日
    000
  • PDF转Word怎么保留原格式_PDF转Word保留原格式的转换技巧

    PDF转Word怎么保留原格式_PDF转Word保留原格式的转换技巧PDF转Word怎么保留原格式_PDF转Word保留原格式的转换技巧PDF转Word怎么保留原格式_PDF转Word保留原格式的转换技巧PDF转Word怎么保留原格式_PDF转Word保留原格式的转换技巧

    使用专业工具、在线平台、Word直接打开或OCR技术可有效将PDF转为Word并保留原格式。首先选择可靠软件如Adobe Acrobat或WPS,启用保留格式选项进行转换;其次可通过Smallpdf等在线平台云端处理,确保预览无误后导出.docx文件;也可用Microsoft Word直接打开PDF…

    2026年8月31日 用户投稿
    500
  • 悟空搜索如何进行高级搜索_悟空搜索高级搜索功能详解

    通过掌握悟空搜索的高级功能可提升查询精准度:一、使用双引号实现完全匹配,减号排除干扰词,site:限定网站范围;二、利用时间与类型筛选器优化结果排序,结合语法如filetype:提高效率;三、在AI对话模式用自然语言提问,获取综合答案并连续追问深化检索。 如果您在使用悟空搜索时发现常规搜索结果不够精…

    2026年8月31日
    000
  • MySQL百万级数据日期查询慢?如何优化日期查询效率?

    MySQL百万级数据日期查询效率提升策略 在处理包含百万级数据的MySQL数据库时,日期查询的性能优化至关重要。本文将通过一个实际案例分析,深入探讨如何提升日期查询效率。 案例分析: 用户使用名为bns_pm_scanhistory_month的表(约100万条数据),其中scantime字段为da…

    2026年8月31日
    100
  • uc浏览器怎么更换主题 uc浏览器更换主题教程

    uc浏览器怎么更换主题 uc浏览器更换主题教程uc浏览器怎么更换主题 uc浏览器更换主题教程uc浏览器怎么更换主题 uc浏览器更换主题教程uc浏览器怎么更换主题 uc浏览器更换主题教程

    手机uc浏览器是一款非常实用的搜索浏览工具,用户可以通过它查找各类资讯。不过,有些用户觉得默认的浏览器主题不够美观,想要更换主题风格,却不知道该如何操作。下面为大家详细介绍手机uc浏览器更换主题的具体步骤,有需要的朋友千万别错过! 手机uc浏览器更换主题教程: 首先,在手机上打开已经安装好的UC浏览…

    2026年8月31日 用户投稿
    000
  • google浏览器怎么卸载干净_google浏览器彻底卸载方法

    通过系统设置卸载Chrome;2. 使用控制面板卸载并删除浏览数据;3. 手动删除AppData和ProgramData中的残留文件;4. 清理注册表中Google相关项;5. 删除Google更新任务并禁用更新服务,确保彻底移除。 如果您发现Google Chrome浏览器占用系统资源或与其他应用…

    2026年8月31日
    200
  • 如何使用Composer解决数据填充问题?league/factory-muffin-faker助你高效生成测试数据

    可以通过一下地址学习composer:学习地址 在开发过程中,测试数据的生成是一个不可避免的环节。然而,当面对复杂的数据模型时,手动创建测试数据不仅耗时,还容易出错。我曾在项目中遇到过这样的问题:需要为一个包含多种关联关系的模型生成大量测试数据。尝试了多种方法后,我发现使用 composer 安装的…

    用户投稿 2026年8月31日
    200
  • 如何使用Overblog/GraphQLBundle解决Symfony项目中的API设计问题?Composer可以帮你实现!

    可以通过一下地址学习composer:学习地址 在现代 web 开发中,api 的设计和实现是一个关键环节。特别是当我们需要为前端提供一个灵活、强大的数据查询接口时,graphql 成为了一个热门的选择。然而,如何在 symfony 项目中高效地实现一个 graphql 服务器,却是一个让我头疼的问…

    用户投稿 2026年8月31日
    100
  • deepseek本地部署后怎么训练详细教程

    本文主要介绍在本地部署 DeepSee 模型并进行训练的详细教程。DeepSee 是一款用于理解和生成文本数据的先进自然语言处理模型。通过该教程,读者可以逐步了解如何设置 DeepSee 的本地环境,准备训练数据,配置模型参数,以及启动训练过程。通过遵循本教程,研究人员和机器学习从业人员可以充分利用…

    2026年8月31日
    100

发表回复

登录后才能评论
关注微信