当前位置: 首页 > ds >正文

python打包工具setuptools

setuptools 是 Python 的一个库,它是用于创建和管理 Python 包(Package)和分发(Distribution)的事实标准工具。 它的主要目的是让你能够轻松地打包你的 Python 项目,以便于分发和安装。

简单来说,它帮你把一堆 .py 文件、数据文件、文档等,打包成一个源代码分发包sdist,通常是 .tar.gz 文件)或一个构建分发包wheel,通常是 .whl 文件)。然后,用户可以使用 pip 来安装这些包。

它解决了什么问题?

想象一下,如果没有 setuptools/pip,你要如何分享你的项目?

  1. 你把代码发给别人。
  2. 他们需要手动将文件复制到正确的目录。
  3. 他们需要手动安装所有依赖项。
  4. 如果项目有 C 扩展,他们需要手动编译,这在不同平台上会非常复杂。

setuptools 将这个过程完全自动化了:

:用 setuptools 定义一个配置文件(如 setup.py 或 setup.cfg 或 pyproject.toml),声明项目元信息(名字、版本、作者等)、依赖项、入口点等。

:使用 setuptools 的命令行工具(或通过 pip)来构建分发包。

用户:只需一条命令 pip install your-package-name 即可完成所有安装步骤(依赖解析、编译、复制文件等)。

核心功能与概念

项目元数据(Metadata)
定义包的基本信息,如 nameversionauthordescriptionurllicense 等。这些信息会出现在 PyPI(Python Package Index)上,并被 pip 识别。

依赖管理(Dependency Management)

install_requires:声明你的包运行时必须依赖哪些其他包。当用户用 pip 安装你的包时,这些依赖会自动被安装。

extras_require:声明一些可选的依赖组,用于安装额外的功能。例如 pip install "your-package[dev]" 会安装开发所需的额外依赖。

包发现(Package Discovery)
自动在项目目录中找到所有的包(即包含 __init__.py 的文件夹),你无需手动列出它们。你也可以通过 packages 参数手动指定。

入口点(Entry Points)
这是一个非常强大的功能,它允许你:

创建命令行工具:定义一个函数,然后通过入口点注册,setuptools 会自动为你生成一个命令行脚本。用户安装你的包后,就可以直接在终端中使用这个命令。

# setup.py

entry_points={

    'console_scripts': [

        'my-command = my_package.module:main_function',

    ],}

插件系统:其他包可以定义入口点,你的包可以去发现并加载这些入口点,从而实现灵活的插件架构。

包含非代码文件
通过 package_data 和 include_package_data 参数,你可以将模板、静态文件(如 CSS/JS)、配置文件等一并打包到分发包中。

如何使用?

历史上,setuptools 主要通过一个名为 setup.py 的 Python 脚本来配置。

传统方式(setup.py

from setuptools import setup, find_packages

setup(

    name="my-awesome-project",

    version="0.1.0",

    author="Your Name",

    author_email="your.email@example.com",

    description="A short description of my project",

    long_description=open('README.md').read(),

    long_description_content_type="text/markdown",

    url="https://github.com/you/my-awesome-project",

    packages=find_packages(), # 自动发现所有包

    classifiers=[

        "Programming Language :: Python :: 3",

        "License :: OSI Approved :: MIT License",

        "Operating System :: OS Independent",

    ],

    python_requires='>=3.6',

    install_requires=[ # 声明依赖

        'requests>=2.25.1',

        'numpy',

    ],

    entry_points={ # 创建命令行工具

        'console_scripts': [

            'my-cli-tool = my_package.cli:main',

        ],

    },

    package_data={ # 包含包内的数据文件

        'my_package': ['data/*.json', 'templates/*.html'],

    },)

然后,你可以使用以下命令来构建和安装:

# 从源代码就地安装(用于开发)

pip install -e .

# 构建源代码分发包

python setup.py sdist

# 构建 wheel 分发包

python setup.py bdist_wheel

现代方式(pyproject.toml
随着 PEP 518 和 PEP 621 的推出,现代 Python 打包更推荐将配置移到一个 pyproject.toml 文件中,这更清晰,且不依赖于特定的构建工具。

toml

# pyproject.toml[build-system]requires = ["setuptools>=61.0.0", "wheel"]build-backend = "setuptools.build_meta"

[project]name = "my-awesome-project"version = "0.1.0"authors = [

  { name="Your Name", email="your.email@example.com" },]description = "A short description of my project"readme = "README.md"requires-python = ">=3.6"license = { file = "LICENSE" }classifiers = [

    "Programming Language :: Python :: 3",

    "License :: OSI Approved :: MIT License",

    "Operating System :: OS Independent",]

dependencies = [

    "requests>=2.25.1",

    "numpy",]

[project.scripts]my-cli-tool = "my_package.cli:main"

[tool.setuptools.package-data]my_package = ["data/*.json", "templates/*.html"]

使用 pip 来构建和安装(这是现代的最佳实践):

# 从源代码安装(用于开发)

pip install -e .

# 构建分发包 (这会同时生成 sdist 和 wheel)

pip install build

python -m build

总结

特性

描述

是什么

Python 打包的事实标准工具。

核心作用

将你的代码、依赖、元信息等打包成一个可分发的格式。

关键功能

元数据管理、依赖声明、自动包发现、创建命令行工具、插件系统。

配置文件

传统用 setup.py,现代用 pyproject.toml。

如何使用

编写配置文件,然后用 pip install . 安装或用 python -m build 构建分发包。

与 pip 关系

setuptools 负责构建包,pip 负责安装包(包括从 PyPI 下载、解决依赖等)。

可以说,setuptools 是现代 Python 生态(PyPI 和 pip)的基石之一,没有它,Python 的包管理不会像今天这样强大和便捷。

http://www.xdnf.cn/news/20491.html

相关文章:

  • Golang中逃逸现象, 变量“何时栈?何时堆?”
  • unsloth 笔记;数据集
  • 什么是CSS
  • v0.29.2 敏感词性能优化之基本类型拆箱、装箱的进一步优化的尝试
  • 用Coze智能体工作流1分钟生成动物进化史视频,无需剪辑,附详细教程
  • 费曼学习法实例--汉诺塔
  • MCP Token超限问题解决方案
  • JDK1.8与1.9哪个好?
  • js逆向Webpack模块加载机制解析:从数组到JSONP
  • Linux 网络流量监控 Shell 脚本详解(支持邮件告警)
  • 基于FPGA的汉明码编解码器系统(论文+源码)
  • 设计模式Design Patterns:组合Composite、命令Command、策略Strategy
  • 【关于线程的一些总结】
  • 进程状态深度解析:从操作系统原理到Linux实践
  • PCB设计布局核心准则
  • 【左程云算法03】对数器算法和数据结构大致分类
  • FPGA会用到UVM吗?
  • Context Engineering survey
  • GraphQL API 性能优化实战:在线编程作业平台指南
  • EG1160 SOP16 高压大电流 半桥驱动芯片
  • 从 scheduler_tick 到上下文切换:深入解析 Linux 内核的 TIF_NEED_RESCHED 标志设置流程
  • 服务器防黑加固指南:SSH端口隐藏、Fail2ban与密钥登录
  • docker run 命令,不接it选项,run一个centos没有显示在运行,而run一个nginx却可以呢?
  • 【LeetCode热题100道笔记】腐烂的橘子
  • Typora处理markdown文件【给.md文档加水印】
  • 使用 TCMalloc 检查内存使用情况和内存泄漏
  • 残差网络 迁移学习对食物分类案例的改进
  • STL模版在vs2019和gcc中的特殊问题
  • STM32项目分享:基于物联网的健康监测系统设计
  • 基于STM32的智能宠物屋系统设计