Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战

news2025/6/7 19:03:23

在 Python 开发中,创建可安装的包是分享代码的重要方式。本文将深入解析两种主流打包方法——setup.pypyproject.toml,并通过一个实际项目示例,展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包。

一、setup.py 与 pyproject.toml 的区别

在这里插入图片描述

1. setup.py(传统方式)

setup.py 是 Python 打包的传统方法,使用 setuptoolsdistutils 定义包的元数据和依赖关系。典型示例如下:

from setuptools import setup

setup(
    name='mypackage',
    version='0.1',
    packages=['mypackage'],
    install_requires=['requests']
)

使用方法

python setup.py sdist bdist_wheel
pip install .

2. pyproject.toml(现代方式)

自 PEP 518 引入后,pyproject.toml 成为推荐的配置方式。它分离了构建系统配置和包元数据,支持多种构建工具(如 setuptoolspoetry 等)。示例:

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

[project]
name = "mypackage"
version = "0.1"
dependencies = ["requests"]

使用方法

pip install .

二、为什么推荐 pyproject.toml?

  1. 标准化与兼容性:符合最新打包标准,与各种工具兼容性更好。
  2. 简化配置:分离构建系统和元数据,使配置更清晰。
  3. 多构建系统支持:支持多种工具,提供更大灵活性。
  4. 安全性:减少对自定义脚本的依赖,降低风险。

实际场景中的必要性

假设你正在开发一个复杂的机器学习库,涉及多个依赖项和复杂的构建步骤。使用 pyproject.toml 可以轻松定义这些需求,并确保在不同的开发和部署环境中保持一致性。此外,许多现代工具(如 CI/CD 系统)已经内置了对 pyproject.toml 的支持,简化了自动化流程。

构建 Python 包的最佳实践

  1. 新项目使用 pyproject.toml:对于新项目,推荐使用 pyproject.toml,以符合现代打包标准并提高兼容性。
  2. 旧项目逐步迁移:如果维护的是已有使用 setup.py 的项目,可以继续使用,但建议在可行时迁移到 pyproject.toml
  3. 结合使用:在某些情况下,可以同时使用 pyproject.tomlsetup.py,例如用 pyproject.toml 处理大部分配置,而保留一个最小化的 setup.py 来处理特定功能(如构建 C 扩展)。
  4. 使用 setup.cfg:如果希望采用更声明式的格式但仍使用 setup.py,可以考虑使用 setup.cfg,将元数据放在配置文件中,逻辑保留在 setup.py 中。
  5. 利用构建工具:使用如 PoetryFlit 等工具,可以简化依赖管理和打包流程,自动管理 pyproject.toml 和其他相关文件的创建。

三、实战示例:构建和发布一个机器学习包

下面通过一个实际的机器学习项目示例,展示如何使用 pyproject.toml 构建、测试和发布一个 Python 包。

项目概述

我们将构建一个名为 mlpredictor 的包,该包:

  • 包含一个使用 scikit-learn 的简单分类器模型。
  • 提供训练模型和进行预测的功能。
  • 结构化以便发布到 PyPI 和 GitHub。

步骤详解

1. 创建项目结构
mlpredictor/
│
├── mlpredictor/
│   ├── __init__.py
│   ├── model.py
│
├── tests/
│   ├── test_model.py
│
├── LICENSE
├── README.md
├── pyproject.toml
└── .gitignore
2. 编写代码

mlpredictor/model.py

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import pickle


class MLPredictor:
    def __init__(self):
        self.model = None

    def train(self):
        iris = load_iris()
        X_train, X_test, y_train, y_test = train_test_split(
            iris.data, iris.target, test_size=0.2, random_state=42
        )
        self.model = RandomForestClassifier()
        self.model.fit(X_train, y_train)

    def predict(self, data):
        if not self.model:
            raise Exception("Model is not trained yet!")
        return self.model.predict([data])

    def save_model(self, path="model.pkl"):
        with open(path, "wb") as f:
            pickle.dump(self.model, f)

    def load_model(self, path="model.pkl"):
        with open(path, "rb") as f:
            self.model = pickle.load(f)

mlpredictor/*init*.py

from .model import MLPredictor

__all__ = ["MLPredictor"]
3. 创建 pyproject.toml 文件

pyproject.toml

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

[project]
name = "mlpredictor"
version = "0.1.0"
description = "A simple machine learning package using scikit-learn"
authors = [
    {name = "Ebrahim", email = "ebimsv0501@gmail.com"}
]
license = {text = "MIT"}
readme = "README.md"
requires-python = ">=3.6"
dependencies = [
    "scikit-learn>=1.0",
]

[project.urls]
"Homepage" = "https://github.com/xxx_your_account/mlpredictor"
  • [build-system]:指定构建系统要求,这里使用 setuptoolswheel
  • [project]:包含包的元数据,如名称、版本、描述、作者、许可证、依赖项等。
4. 编写测试

使用 pytest 添加测试。

tests/test_model.py

import pytest
from mlpredictor import MLPredictor

def test_train_and_predict():
    model = MLPredictor()
    model.train()
    result = model.predict([5.1, 3.5, 1.4, 0.2])
    assert len(result) == 1

if __name__ == "__main__":
    pytest.main()
5. 添加 README、License 和 .gitignore

README.md

# MLPredictor

MLPredictor 是一个简单的机器学习包,使用 scikit-learn 训练 RandomForest 模型,并使用户能够进行预测。该包旨在演示如何打包 Python 机器学习项目以供分发。

## 特性

- 在 Iris 数据集上训练 RandomForestClassifier。
- 训练后对新数据进行预测。
- 保存和加载训练好的模型。

## 安装

您可以通过 **PyPI** 或从 **源代码** 安装该包。

### 通过 PyPI 安装

```bash
pip install mlpredictor

通过源代码安装(GitHub)

git clone https://github.com/xxx_your_account/mlpredictor.git
cd mlpredictor
pip install .

使用方法

安装后,可以使用 MLPredictor 训练模型并进行预测。

示例:训练和预测

from mlpredictor import MLPredictor

# 初始化预测器
predictor = MLPredictor()

# 在 Iris 数据集上训练模型
predictor.train()

# 对样本输入进行预测
sample_input = [5.1, 3.5, 1.4, 0.2]
prediction = predictor.predict(sample_input)

print(f"预测类别: {prediction}")

LICENSE

可以选择合适的开源许可证,如 MIT License。

.gitignore

*.pyc
__pycache__/
*.pkl
dist/
build/
6. 本地测试包

通过以下命令安装包:

pip install .

安装后,运行测试以确保一切正常:

pytest tests

注意

  • 如果使用 setup.py,它会读取 setup.py 文件以收集包元数据和安装信息,并解析和安装指定的依赖项。

  • 如果使用pyproject.toml ,它会读取该文件,可能指定构建系统要求和配置。执行上述命令后,通常会创建以下目录:

    • Distribution Directory:可能是 build/dist/.eggs/ 目录,具体取决于安装过程以及是源码安装还是 wheel 安装。
    • build/:在构建过程中创建,包含用于创建包的临时文件。
    • dist/:包含从包生成的构建分发文件(如 wheel 文件)。
    • egg-info/.egg-info/:包含有关已安装包的元数据,包括其依赖项和版本号。

确保项目正常工作后,继续后续步骤。

7. 推送到 GitHub
  1. 初始化 Git 仓库

    git init
    git add .
    git commit -m "Initial commit"
    
  2. 创建 GitHub 仓库

    前往 GitHub 并创建一个名为 mlpredictor 的新仓库。

  3. 推送代码到 GitHub

    git remote add origin https://github.com/xxx_your_account/mlpredictor.git
    git branch -M main
    git push -u origin main
    

    注意:将 xxx_your_account 替换为您的 GitHub 用户名。

8. 发布到 PyPI

现在项目已经设置并推送到 GitHub,可以将其发布到 PyPI。

  1. 安装必要的工具

    pip install twine build
    
  2. 构建包

    python -m build
    

    这将在 dist/ 目录下创建 .tar.gz.whl 文件。检查 dist/ 目录,确保包含类似以下文件:

    mlpredictor-0.1.0-py3-none-any.whl
    mlpredictor-0.1.0.tar.gz
    
  3. 上传到 PyPI

    twine upload dist/*
    

    您需要一个 PyPI 账户才能上传包。上传成功后,其他人可以通过以下命令安装您的包:

    pip install mlpredictor
    
9. 安装并使用包

通过 pip 安装后,可以在 Python 代码中使用该包:

from mlpredictor import MLPredictor

predictor = MLPredictor()
predictor.train()
prediction = predictor.predict([5.1, 3.5, 1.4, 0.2])
print("Predicted class:", prediction.item())

# 输出示例:
# Predicted class: 0

五、总结

在 Python 打包领域,setup.pypyproject.toml 各有其重要性和适用场景。尽管 setup.py 在传统项目中仍然发挥作用,但向 pyproject.toml 的转变代表了 Python 社区向更安全、标准化实践发展的趋势。对于新项目,强烈建议采用 pyproject.toml,因为它不仅简化了打包过程,还提高了与各种工具和库的兼容性。

通过本文的实战示例,您应该能够掌握如何使用 pyproject.toml 构建、测试和发布一个功能完善的 Python 包。无论是个人项目还是团队协作,遵循这些最佳实践将大大提升项目的可维护性和可扩展性。

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

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

相关文章

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载(CacheLoader)2.2.1 示例代码 2.3 缓存移除与监听(invalidate removalListener) 3. 缓存回收策略3.1 基于容量的回收&…

python入门(1)

第一章 第一个python程序 1.1 print函数 print方法的作用 : 把想要输出的内容打印在屏幕上 print("Hello World") 1.2 输出中文 在Python 2.x版本中,默认的编码方式是ASCII编码方式,如果程序中用到了中文,直接输出结果很可能会…

【PDF提取表格】如何提取发票内容文字并导出到Excel表格,并将发票用发票号改名,基于pdf电子发票的应用实现

应用场景 该应用主要用于企业财务部门或个人处理大量电子发票,实现以下功能: 自动从 PDF 电子发票中提取关键信息(如发票号码、日期、金额、销售方等)将提取的信息整理并导出到 Excel 表格,方便进行财务统计和报销使…

Hugging Face 最新开源 SmolVLA 小模型入门教程(一)

系列文章目录 目录 系列文章目录 前言 一、引言 二、认识 SmolVLA! 三、如何使用SmolVLA? 3.1 安装 3.2 微调预训练模型 3.3 从头开始训练 四、方法 五、主要架构 5.1 视觉语言模型(VLM) 5.2 动作专家:流匹…

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发 零一 vscode1.1 下载 vscode1.2 下载插件1.3 安装 二 anaconda 32.1 下载2.2 新建虚拟环境1 新建快捷方式,启动base2 新建虚拟环境 3 配置Qt designer3.1 designer.exe和uic.exe3.2 设置插件,3.4 ui文件转为py文件 4使用4.1 …

大话软工笔记—组合要素2之逻辑

1. 逻辑的概念 逻辑,指的是思维的规律和规则,是对思维过程的抽象。 结合逻辑的一般定义以及信息系统的设计方法,对逻辑的概念进行抽提、定义为三个核心内涵,即:规律、顺序、规则。 (1)规律&a…

7.Demo Js执行同步任务,微任务,宏任务的顺序(3)

一个包含 同步任务、微任务(Promise)、宏任务(setTimeout) 的例子,JS 是怎么调度这些任务的。 🎯 例子代码(建议复制到浏览器控制台运行) console.log(‘同步任务 1’); setTimeo…

边缘计算网关赋能沸石转轮运行故障智能诊断的配置实例

一、项目背景 在环保行业,随着国家对大气污染治理要求的不断提高,VOCs废气处理成为了众多企业的重要任务。沸石转轮作为一种高效的VOCs治理设备,被广泛应用于石油化工、汽车制造、印刷包装等主流行业。这些行业生产规模大、废气排放量多&…

UE5 2D角色PaperZD插件动画状态机学习笔记

UE5 2D角色PaperZD插件动画状态机学习笔记 0.安装PaperZD插件 这是插件下载安装地址 https://www.fab.com/zh-cn/listings/6664e3b5-e376-47aa-a0dd-f7bbbd5b93c0 1.右键创建PaperZD 动画序列 2.添加动画序列 3,右键创建PaperZD AnimBP (动画蓝图&am…

Ubuntu 16.04 密码找回

同事整理的供参考: 进入GRUB菜单 重启系统,在启动过程中长按Shift键(或Esc键)进入GRUB引导菜单。 若未显示GRUB菜单,可尝试在启动时连续按多次Shift/Esc键。 在GRUB菜单中选择默认的Ubuntu启动项(第一…

【论文阅读】DanceGRPO: Unleashing GRPO on Visual Generation

DanceGRPO: Unleashing GRPO on Visual Generation 原文摘要 研究背景与问题 生成模型的突破:扩散模型和整流流等生成模型在视觉内容生成领域取得了显著进展。核心挑战:如何让模型的输出更好地符合人类偏好仍是一个关键问题。现有方法的局限性&#xff1…

CentOS在vmware局域网内搭建DHCP服务器【踩坑记录】

1. 重新设置环境 配置dhcp服务踩了不少坑,这里重头搭建记录一下: 1.1 centos 网卡还原 如果之前搭了乱七八糟的环境,导致NAT模式也没法上网,这里重新还原 我们需要在NAT模式下联网,下载DHCP服务 先把centos的网卡还…

AI炼丹日志-28 - Audiblez 将你的电子书epub转换为音频mp3 做有声书

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 大模型与Java双线更新中! 目前《大语言模型实战》已连载至第22篇,探索 MCP 自动操作 FigmaCursor 实…

74. 搜索二维矩阵 (力扣)

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…

8088单板机C语言sprintf()格式化串口输出---Prj04

#include "tiny_stdarg.h" // 使用自定义可变参数实现#define ADR_273 0x0200 #define ADR_244 0x0400 #define LED_PORT 0x800 #define PC16550_THR 0x1f0 #define PC16550_LSR 0x1f5 / //基本的IO操作函数 / char str[]"Hello World! 20250531 Ve…

板凳-------Mysql cookbook学习 (九)

第4章:表管理 4.0 引言 MySQL :: 员工样例数据库 :: 3 安装 https://dev.mysql.com/doc/employee/en/employees-installation.html Employees 数据库与几种不同的 存储引擎,默认情况下启用 InnoDB 引擎。编…

基于SpringBoot的“嗨玩旅游”网站设计与实现(源码+定制+开发)嗨玩旅游平台开发:景点展示与个性化推荐系统(SpringBoot)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

python版若依框架开发:python版若依部署

python版若依框架开发 从0起步,扬帆起航。 python版若依部署文章目录 python版若依框架开发1.源码2.概述3.部署1.源码 https://gitee.com/insistence2022/RuoYi-Vue-FastAPI 请诸君移步上述链接,即可对python版若依项目进行初步了解。 2.概述 若依框架本身基于java,可以快…

h5的aliplayer-min.js 加密视频会走到debugger

h5的aliplayer-min.js 如果 https://g.alicdn.com/apsara-media-box/imp-web-player/2.19.0/aliplayer-min.js走加密视频的话会有debugger 更换aliplayer-min.js版本解决了 https://g.alicdn.com/apsara-media-box/imp-web-player/2.25.1/aliplayer-min.js 对应css&#xff1a…

DashBoard安装使用

DashBoard安装使用 一、实验目的 1、掌握dashboard 的安装部署 2、熟悉图像化部署任务:产生pod---定义服务--验证访问 二、实验内容: 1、配置步骤 1.1、Helm安装 离线安装(适用于内网/离线环境) # 根据系统架构选择版本&am…