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

打包Python项目

打包Python项目

本教程将指导您如何打包一个简单的Python项目。它将 向您展示如何添加必要的文件和结构来创建包,如何 构建包,以及如何将其上传到Python包索引(PyPI)。

尖端

如果您在运行本教程中的命令时遇到问题,请复制命令 及其输出,然后在packaging-problems存储库上打开一个issue, GitHub.我们会尽力帮助你!

有些命令需要较新版本的pip,因此, 确保您安装了最新版本:

Unix/macOS Windows
py -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建议将目录作为常规包导入, 即使像我们在本教程中的情况那样,该文件是空的[1]。

example.py是包中的一个模块的示例, 包含逻辑(函数、类、常量等)你的包裹。 打开该文件并输入以下内容:

def add_one(number):return number + 1

如果你不熟悉Python 导入软件包,请花几分钟时间阅读 Python包和模块的文档。

创建此结构后,您需要运行此 packaging_tutorial目录中的教程。

创建包文件

现在将添加用于准备项目以进行分发的文件。 完成后,项目结构将如下所示:

packaging_tutorial/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│   └── example_package_YOUR_USERNAME_HERE/
│       ├── __init__.py
│       └── example.py
└── tests/

创建测试目录

tests/是测试文件的占位符。先把它空着。

选择构建后端

像pip和build这样的工具实际上并不转换你的源代码 进入一个分发包(像一个轮子); 该作业由构建后端执行。构建后端确定如何 您的项目将指定其配置,包括元数据(信息 例如,PyPI上显示的名称和标记) 和输入文件。构建后端具有不同级别的功能,例如 是否支持构建扩展模块,以及 你应该选择一个适合你的需要和喜好。

您可以从许多后端中进行选择;本教程默认使用Hatchling,但它与Setuptools的工作方式相同, Flit、PDM和其他支持[project] 元数据表。

注意

一些构建后端是提供命令行的大型工具的一部分 具有项目初始化和版本等附加功能的接口 管理,以及构建,上传和安装软件包。这 教程使用独立工作的单一用途工具。

pyproject.toml告诉构建前端工具,如pip和 构建用于项目的后端。下面是一些 常见构建后端的示例,但请检查后端自己的文档 的双曲余切值。

hatchling
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
setuptools 微片 PDM

requires键是构建包所需的包列表。 前端应该在构建包时自动安装它们。 前端通常在隔离的环境中运行构建,因此忽略依赖项 可能会导致构建时错误。 这应该总是包括你的后端的包,并可能有其他的构建时间 个依赖项

build-backend键是前端将使用的Python对象的名称 来执行构建。

这两个值都将由构建的文档提供 后端,或由其命令行界面生成。应该没有必要 您可以自定义这些设置。

构建工具的其他配置将在tool部分中 或者在构建工具定义的特殊文件中。为 例如,当使用pyproject.toml作为构建后端时, 可以添加到setuptoolssetup.py文件中,并指定 setup.cfg在你的构建中允许工具定位和使用这些 的自动

配置元数据

打开pyproject.toml,输入以下内容。更改name 以包含您的用户名;这可确保您拥有唯一的 与其他人上传的软件包不冲突的软件包名称 遵循本教程。

[project]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [{ name="Example Author", email="author@example.com" },
]
description = "A small example package"
readme = "README.md"
requires-python = ">=3.8"
classifiers = ["Programming Language :: Python :: 3","License :: OSI Approved :: MIT License","Operating System :: OS Independent",
][project.urls]
Homepage = "https://github.com/pypa/sampleproject"
Issues = "https://github.com/pypa/sampleproject/issues"
  • name是您的软件包的分发名称。它可以是任何名称, 只要它只包含字母、数字、._-。它还 不能在PyPI上使用。请务必更新此与您的 本教程的用户名,因为这可以确保您不会尝试上传 与已存在的包同名的包。

  • version是包的版本号。(Some构建后端允许它成为 以其他方式指定,例如从文件或Git标签。

  • authors用于标识包的作者;您指定一个名称 每个作者的电子邮件。您也可以在同一个列表中列出maintainers 格式.

  • description是一个简短的,一句话的总结包。

  • readme是一个文件的路径,该文件包含 包.这显示在PyPI上的包详细信息页面上。 在这种情况下,描述从README.md加载(这是一个 共同模式)。中还描述了一种更高级的表格形式, pyproject.toml guide.

  • requires-python给出了您的 项目像pip这样的安装程序将通过旧版本的 包,直到找到一个具有匹配Python版本的包。

  • classifiers给出索引和pip一些额外的元数据 关于你的包裹在这种情况下,该包仅与Python兼容 3,根据MIT许可证授权,并且独立于操作系统。你应该 总是至少包括你的包工作在哪个版本的Python上, 您的软件包在哪个许可证下可用,以及哪些操作系统 有关分类器的完整列表,请参见 https://pypi.org/classifiers/.

  • urls允许您列出任何数量的额外链接以在PyPI上显示。 一般来说,这可能是源代码,文档,问题跟踪器等。

有关详细信息,请参阅pyproject.toml指南 在这些和其他领域,可以定义在[project] 表.其他常用字段为keywords,以提高可扩展性 

创建README.md

打开README.md,输入以下内容。您可以自定义此 如果你愿意的话

# Example PackageThis is a simple example package. You can use
[GitHub-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.

创建许可证

上传到Python包索引的每个包都必须包含 一张执照。这会告诉安装您的软件包的用户, 可以使用你的包裹。有关选择许可证的帮助,请参见 https://sealicense.com/.选择许可证后,打开 LICENSE并输入许可证文本。例如,如果您选择了 MIT许可证:

Copyright (c) 2018 The Python Packaging AuthorityPermission 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.

大多数构建后端会自动在包中包含许可证文件。看到你 backend的文档了解更多详情。

包括其他文件

上面列出的文件将自动包含在您的 源分布如果你想 包括其他文件,请参阅构建后端的文档。

正在生成分发存档

下一步是生成分发包 为了包裹这些是上传到Python的存档, 软件包索引,可以通过pip安装。

确保你安装了最新版本的PyPA

py -m pip install --upgrade build

尖端

如果在安装这些组件时遇到问题,请参阅 安装软件包教程。

现在从pyproject.toml所在的同一目录运行此命令:

py -m build

此命令应输出大量的文本,一旦完成应生成两个 dist目录中的文件:

dist/
├── example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
└── example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz

tar.gz文件是一个源代码发行版 而.whl文件是一个构建的发行版。 较新的pip版本优先安装已构建的发行版,但 如果需要的话,回退到源代码分发。你应该总是上传一个源 发行版,并为您的项目所在的平台提供构建的发行版。 兼容。在这种情况下,我们的示例包与Python兼容, 任何平台,因此只需要一个构建的发行版。

分发档案

最后,是时候把你的包上传到Python包索引了!

你需要做的第一件事是在TestPyPI上注册一个帐户, 是用于测试的包装索引的单独实例, 实验这对于像本教程这样的东西来说是很好的, 一定要上传到真实的索引。要注册帐户,请转到 https://test.pypi.org/account/register/并完成该页面上的步骤。 您还需要验证您的电子邮件地址,然后才能上传 任何包裹。 有关更多详细信息,请参阅使用TestPyPI。

要安全地上传项目,您创建一个在 https://test.pypi.org/manage/account/#api-tokens,将“范围”设置为“整个 账户”。在复制并保存令牌之前,请不要关闭页面-您 再也见不到那个信物了

现在您已注册,您可以使用GoogleChrome上载 分销包。你需要安装Twine:

py -m pip install --upgrade twine

安装完成后,运行Twine上传dist下的所有归档文件:

py -m twine upload --repository testpypi dist/*

请输入用户名和密码对于用户名, 使用__token__。对于密码,使用令牌值,包括 pypi-前缀。

命令完成后,您应该看到类似于以下内容的输出:

Uploading distributions to https://test.pypi.org/legacy/
Enter your username: __token__
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上查看;例如: https://test.pypi.org/project/example_package_YOUR_USERNAME_HERE.

安装新上传的软件包

您可以使用pip安装您的软件包并验证它是否工作。 创建虚拟环境 然后从TestPyPI安装你的包:

py -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-package-YOUR-USERNAME-HERE

请确保在软件包名称中指定您的用户名!

pip应该安装来自TestPyPI的包,输出应该是 就像这样:

Collecting example-package-YOUR-USERNAME-HEREDownloading https://test-files.pythonhosted.org/packages/.../example_package_YOUR_USERNAME_HERE_0.0.1-py3-none-any.whl
Installing collected packages: example_package_YOUR_USERNAME_HERE
Successfully installed example_package_YOUR_USERNAME_HERE-0.0.1

注意

本例使用--index-url标志指定TestPyPI,而不是 Live PyPI。此外,它还指定了--no-deps。由于TestPyPI不 有与PyPI相同的包,尝试 安装依赖项可能会失败或安装一些意外的东西。虽然我们的 示例包没有任何依赖项,这是一个很好的做法,以避免 使用TestPyPI时安装依赖项。

您可以通过导入软件包来测试它是否正确安装。 确保你仍然在虚拟环境中,然后运行Python:

py

然后导入包:

 
from example_package_YOUR_USERNAME_HERE import example
example.add_one(2)
3

后续步骤

恭喜你,你已经打包并发布了一个Python项目! ✨ 🍰 ✨

请记住,本教程向您展示了如何将包上传到Test PyPI,它不是永久存储。测试系统偶尔会删除 包和账户。最好使用TestPyPI进行测试和实验 就像这个教程。

当您准备好将一个真实的包上传到Python包索引时,您可以 执行与本教程中相同的操作,但使用这些重要的 差异:

  • 为您的包裹选择一个难忘且独特的名称。你不必附加 您的用户名,就像您在教程中所做的那样,但您不能使用现有的名称。

  • 在https://pypi.org上注册一个帐户-请注意,这是两个独立的 服务器和来自测试服务器的登录详细信息不与 主服务器

  • 使用twine upload dist/*上传包并输入凭据 你在真实的PyPI上注册的账户 既然你上传了 在生产环境中,您不需要指定--repository; 默认情况下,包将上传到https://pypi.org/。

  • 使用python3 -m pip install [your-package]从真实的PyPI安装您的软件包。

在这一点上,如果你想关于打包Python库的信息,请点击这里。 你可以做的一些事情:

  • 阅读有关您选择的构建后端的高级配置: Hatchling, setuptools, Flit, PDM.。

  • 查看本网站上的指南,了解更多高级 实用信息或讨论 了解有关特定主题的解释和背景。

  • 考虑打包工具,这些工具提供单个命令行界面, 项目管理和包装,如hatch, flit, pdm, 和poetry。


注意到

[1]

从技术上讲,你也可以创建没有__init__.py文件的Python包, 但它们被称为命名空间包 并将其视为高级主题(本教程中未涉及)。 如果您刚刚开始使用Python打包,建议您 坚持使用常规包和__init__.py(即使文件是空的)。

相关文章:

打包Python项目

打包Python项目 本教程将指导您如何打包一个简单的Python项目。它将 向您展示如何添加必要的文件和结构来创建包,如何 构建包,以及如何将其上传到Python包索引(PyPI)。 尖端 如果您在运行本教程中的命令时遇到问题,请…...

使用Python实现爬虫IP负载均衡和高可用集群

做大型爬虫项目经常遇到请求频率过高的问题,这里需要说的是使用爬虫IP可以提高抓取效率,那么我们通过什么方法才能实现爬虫IP负载均衡和高可用集群,并且能快速的部署并且完成爬虫项目。 通常在Python中实现爬虫ip负载均衡和高可用集群需要一…...

Jenkins+Maven+Gitlab+Tomcat 自动化构建打包,部署

环境准备 1、安装服务 Jenkins工具、环境、插件配置 全局变量配置 Manage Jenkins>tools>JDK 安装 安装插件 Deploy to container 安装此插件,才能将打好的包部署到tomcat上 配置国内mvn源 创建maven项目 1 2 3 4 5 6 7 8 9 10...

泰凌微(Telink)8258配置串口收发自定义数据

在官网下载SDK后(以Mesh SDK为例)使用Eclipse打开,对应MCU的配置文件在app_config_8258.h,默认的HCI接口是HCI_USE_NONE,如果改成HCI_USE_UART后可以通过串口收发数据,此时默认接收函数处理的是以Telink的协…...

入门低代码开发:快速构建应用程序的方法

一、什么是低代码 低代码开发是一种通过可视化建模和拖拽式设计工具来快速构建应用程序的方法。传统软件开发通常需要编写大量的代码,而低代码开发则提供了更高层次的抽象,使开发过程更加简单和高效。通过可视化界面,用户可以通过拖拽组件、配…...

常见客户端消息推送服务【Java后端】

客户端消息推送 1、推送服务 苹果 APNs(Apple Push Notification service) 谷歌 FCM(Firebase Cloud Messaging)GCM(Google Cloud Messaging) 第三方 个推(Getui)UniApp&#xff…...

C++11(下)

可变参数模板 C11的新特性可变参数模板能够创建可以接受可变参数的函数模板和类模板. 相比C98/03, 类模版和函数模版中只能含固定数量的模版参数, 可变模版参数无疑是一个巨大的改进, 然而由于可变模版参数比较抽象, 使用起来需要一定的技巧, 所以这块还是比较晦涩的.掌握一些基…...

深度学习与逻辑回归模型的融合--TensorFlow多元分类的高级应用

手写数字识别 文章目录 手写数字识别1、线性回归VS逻辑回归Sigmoid函数 2、逻辑回归的基本模型-神经网络模型3、多元分类基本模型4、TensorFlow实战解决手写数字识别问题准备数据集数据集划分 特征数据归一化归一化方法归一化场景 标签数据独热编码One-Hot编码构建模型损失函数…...

水库大坝安全监测参数与设备

智慧水利中,水库大坝的安全监测必不可少。做好水库大坝的安全监测,是确保水库大坝结构安全和预防灾害的重要手段。对于预防灾害、保护人民生命财产安全、优化工程管理、改进工程设计、保护环境资源和提高公众信任等方面有着重要的意义。 水利水库大坝安全…...

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 22 章:情感分析提示

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 22 章:情感分析提示 情感分析是一种可以让模型确定一段文字的情感基调或态度的技术,比如它是正面的、负面的还是中性的。 要在 ChatGPT 中使用情感分析提示,应向模型提…...

数据清洗、特征工程和数据可视化、数据挖掘与建模的主要内容

1.4 数据清洗、特征工程和数据可视化、数据挖掘与建模的内容 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.4节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学…...

C++ STL容器与常用库函数

STL是提高C编写效率的一个利器 STL容器&#xff1a; 一、#include <vector> 英文翻译&#xff1a;vector &#xff1a;向量 vector是变长数组(动态变化)&#xff0c;支持随机访问&#xff0c;不支持在任意位置O(1)插入。为了保证效率&#xff0c;元素的增删一般应该在末尾…...

Nmap脚本简介

什么是Nmap脚本 Nmap脚本是一种由Nmap扫描器使用的脚本语言&#xff0c;用于扫描目标网络中的主机、端口、服务等信息&#xff0c;并提供一系列自动化的测试和攻击功能。从渗透测试工程师的角度来看&#xff0c;Nmap脚本是一种非常有用的工具&#xff0c;能够帮助渗透测试工程师…...

Kafka -- 初识

目录 kafka是什么 Topic Partition Broker Cousumer CousumerGroup Offset reblance broker 消息存储 Isr kafka是什么 Kafka 是一个分布式的消息引擎&#xff0c;能够发布和订阅消息流&#xff08;类似于消息队列&#xff09; 以容错的、持久的方式存储消息流 多分区…...

玩转Sass:掌握数据类型!

当我们在进行前端开发的时候&#xff0c;有时候需要使用一些不同的数据类型来处理样式&#xff0c;Sass 提供的这些数据类型可以帮助我们更高效地进行样式开发&#xff0c;本篇文章将为您详细介绍 Sass 中的数据类型。 布尔类型 在 Sass 中&#xff0c;布尔数据类型可以表示逻…...

Django + Matplotlib:实现数据分析显示与下载为PDF或SVG

写作背景 首先&#xff0c;数据分析在当前的信息时代中扮演着重要的角色。随着数据量的增加和复杂性的提高&#xff0c;人们对于数据分析的需求也越来越高。 其次&#xff0c;笔者也确确实实曾经接到过一个这样的开发需求&#xff0c;甲方是一个医疗方面的科研团队&#xff0…...

【Rust】第一节:安装

1 说明 一些学习记录 环境&#xff1a;MacOS 2 步骤 1、执行curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 2、看到打印 info: downloading installerWelcome to Rust!... ...This path will then be added to your PATH environment variable by modifyin…...

12-07 周四 Pytorch 使用Visdom 进行可视化

简介 在完成了龙良曲的Pytroch视频课程之后&#xff0c;楼主对于pytroch有了进一步的理解&#xff0c;比如&#xff0c;比之前更加深刻的了解了BP神经网络的反向传播算法&#xff0c;梯度、损失、优化器这些名词更加熟悉。这个博客简要介绍一下在使用Pytorch进行数据可视化的一…...

基于微信小程序的智慧校园导航系统研究

点我下载完整版 基于微信小程序的智慧校园导航系统研究 Research on Smart Campus Navigation System based on WeChat mini program 目录 目录 2 摘要 3 关键词 4 第一章 研究背景与意义 4 1.1 校园导航系统研究的背景 4 1.2 微信小程序在校园导航系统中的应用 5 1.3 研究的目…...

VUE3给table的head添加popover筛选、时间去除时分秒、字符串替换某字符

1. VUE3给table的head添加popover筛选 <el-tableref"processTableRef"class"process-table"row-key"secuId":data"pagingData"style"width: 100%"highlight-current-row:height"stockListHeight":default-exp…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...