如何构建Python软件包并上传到Pypi

2023-11-08

因为最近在做Python包,所以也了解了一下这个。这里我把我自己的学习经验写出来,如果哪里写的不好也请大家提出来。本文的内容大多数都来自 Packaging Python Projects - Pypi ,我根据我的理解进行描述一下。

Pypi的文档截图


演示配置

  • 操作系统:Windows 10 22H2
  • Python环境:Python 3.11.1
  • pip版本:22.3.1

配置环境

需要的工具:build(构建),twine(上传)

build 的安装方法
py -m pip install --upgrade build
twine的安装方法
py -m pip install --upgrade twine

写配置文件

readme.md

这个可以是任意内容,但必须要遵守Markdown格式,这个文件实际在pypi显示出来的效果是这样的。

pyproject.toml

这个文件用于告诉pip这个包的一些相关信息,如作者,描述文件等。

官方文档给出的示例是这样的

[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.7"
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]

[project.urls]
"Homepage" = "https://github.com/pypa/sampleproject"
"Bug Tracker" = "https://github.com/pypa/sampleproject/issues"

或者你可以参考一下我的项目中的是怎么写的。

这里 翻译 讲解一下各项的意义

  • name是包的分发名称。这可以是任何名称。
  • version是包版本。有关版本的更多详细信息,请参阅版本说明符规范。一些构建后端允许指定它使用另一种方式,例如从文件或 git 标签。
  • authors用于标识包的作者。您指定一个名称,以及每位作者的电子邮件。
  • description是包的简短、一句话的摘要。
  • readme是显示在 PyPI 上的包详细信息页面上的描述文件。项目元数据规范中还描述了更高级的表形式。
  • requires-python提供您的项目支持的 Python 版本。像 pip 这样的安装程序会回顾旧版本的包,直到找到具有匹配 Python 版本的包。
  • classifiers为索引和点提供一些额外的元数据 关于您的包裹。在官方示例的这种情况下,该包仅兼容 Python 3,根据 MIT 许可证获得许可,并且独立于操作系统。你应该始终至少包括您的软件包适用于哪个版本的 Python, 您的软件包在哪个许可证下可用,以及哪些操作系统可以让您的软件包正常工作。有关classifiers的完整列表,请参阅 https://pypi.org/classifiers/。
  • urls允许您列出任意数量的额外链接以在 PyPI 上显示。 通常,这可能是针对源,文档,问题跟踪器等。

pyproject.toml文件的方法

它在pypi上是这样显示的。

setup.py(可选)

如果你的项目包含多个文件夹,你可以使用它进行配置。这个是我的项目的文件,我提供出来作为示例。

#!/usr/bin/env python

from distutils.core import setup

setup(name='heframework',
      version='0.2.10',
      description='本次更新:修复list模块对中文的支持',
      author='heStudio',
      author_email='hestudio@hestudio.net',
      url='https://gitee.com/hestudio-framework/main-windows/',
      packages=['src',""],
     )


其中,name, version, description, author, author_emailpyproject.toml一致,url为你的项目的主页。

packages用元组表示你的项目所包含的文件夹,在我的示例中,我所包含的文件夹从左到右依次是src文件夹和项目根目录。在这个文件中,我们用空白项(如我的示例中的packages的第二个)表示根目录。

构建项目

我们已经在前面安装过了工具和写了配置文件,这个时候就可以开始构建项目了。

使用以下命令构建。

py -m build

当出现 Successfully 的时候,就代表项目构建成功。此时,你的项目文件夹内会生成dist文件夹,这个文件夹内就是你构建的文件。

上传项目

上传到testpypi测试

你需要在 https://test.pypi.org/account/register/ 注册一个账号用于测试你的安装包。你需要验证你的邮箱。然后上传进行测试。这里我已经尝试过了,如果你需要看具体如何操作,请阅读正式上传的部分(在下面)

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

然后通过以下命令进行安装

py -m pip install -i https://test.pypi.org/simple/  example

其中example是你的项目的名称,它应该为上文的name的值。

正式上传到pypi

是的,也就是通过我们熟知的pip安装。

首先你需要注册一个pypi账号,并验证你的邮箱。pypi账号和testpipy账号是截然不同的两个体系。
然后通过以下命令上传。

py -m twine upload dist\*

最后,我们直接安装就可以。

pip install example

其中example是你的项目的名称,它应该为上文的name的值。

后记

我的博客 https://www.hestudio.net

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建Python软件包并上传到Pypi 的相关文章

  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • gitlab 请求将分支 A 合并到开发中(落后 3 次提交)我应该担心吗?

    在 gitlab 中创建合并请求时 我经常收到一条消息 请求将分支 A 合并到开发中 x 提交落后 gitlab想告诉我什么 我应该担心还是需要修复某些东西 什么 一段时间后合并请求在项目中打开时 由于其他人合并了自己的更改 您尝试合并到的
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 按时间顺序将多个文件夹提交到 git 中

    我有数百个网站备份 每个文件夹一个 我想将它们放入 git 存储库中 每个备份作为一个版本 这些变化主要涉及图像文件和每天 2 个数据库备份 大小约为 25 GB 并且不断增加 有没有办法告诉 git 获取其中一个文件夹并将其提交到存储库中
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数

随机推荐

  • java中的IO整理

    写在前面 本文章基本覆盖了java IO的全部内容 文章以例子为主 因为讲解内容的java书很多了 我觉的学以致用才是真 代码是写出来的 不是看出来的 最后欢迎大家提出意见和建议 案例1 创建一个新文件 1 2 3 4 5 6
  • linux安装nginx+php

    在centos服务器下 mkdir docker cd docker mkdir nginx mkdir php mkdir www 2 拉取镜像 docker pull nginx docker pull php 7 4 fpm dock
  • CentOS 7 分区方案

    通常系统盘都会选择性能较好SSD 一般在500G左右 这里就以500G硬盘为例 以下为CentOS 自动分区方案 分区应该按照实际服务器用途而定 自动分区方案将 home 空间分配太多了 多数情况下并不适用 必须存在的分区 分区是必须存在的
  • 如何卸载、删除Anaconda?

    Anaconda这么好用 为啥要删呢 当然是我之前装得乱七八糟 导致现在心情不好 我要把它全部删掉 ok 开始 删除思路 首先利用anaconda clean清理包清理配置文件 然后直接用安装目录下的卸载程序卸载即可 一 anaconda
  • 算法分析基础

    问题 如何比较不同算法的性能 分析算法的运行时间 算法分析的原则 归纳基本操作 如 运算 赋值 比较 统一机器性能 假设基本操作代价均为1 统一机器性能后 算法运行时间依赖于问题输入规模与实例 相同输入规模 实例影响运行 最好情况 不常出现
  • spark 参数调优3-Shuffle Behavior

    spark参数调优系列 目录地址 https blog csdn net zyzzxycj article details 81011540 Shuffle Behavior spark reducer maxSizeInFlight 默认
  • JSP中使用element-ui

    首先需要下载element ui 可以直接在github下载即可 script 引入 这样就可以使用了 如 this message 已经上传过了 无需重复上传 注 vue里面直接使用 this即可 jsp里面想使用的可以试试了
  • 浏览器客户端生成唯一标识码

    created this getFinger methods getFinger const canvas document createElement canvas const ctx canvas getContext 2d const
  • 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一 实验目的 二 实验要求 三 实验的硬件 软件平台 四 实验原理 1 1 深度学习概述 1 2 深度学习的常见结构 1 3 卷积神经网络 CNN 卷积 池化 全连接网络 1 4 卷积神经网络的大致结构 1 5 参数学习
  • 动态规划—分割回文串-ii 解析+代码

    分割回文串 ii 题目链接 分割回文串 ii 思路 分割字符串s 使得子串都是回文串 最后获得最小分割次数 那么我们可以不断把字符串缩短 判断子串是否可以被分割成回文串 并且最小分割次数 这就是子问题分割了 所以我们可以使用动态规划 状态
  • python3 发送邮件 send mail 使用 163 smtp服务器

    监控本地网络速度 通过api 请求速度 发现速度异常 发送报警邮件 usr bin env python3 coding UTF 8 import smtplib time from email mime text import MIMET
  • 深入理解equals和==的区别

    今天在群里面看到这个问题 equals和 的区别是什么 我有点迟钝 不就是如果是String类型的话equals比较的是内容 非字符串类型则比较的是内容吗 我想里面的考点也没有多少吧 然后我就回复了一个 equals本来就是为了比较内容出现
  • c++ STL中sort函数的三种使用方法

    复习一下 STL C 中的标准模板库 使用起来方便并且效率较高 sort函数有三种用法 一 对基本类型数组从小到大排序 sort 数组名 n1 数组名 n2 将数组中下标从n1到n2的元素进行从小到大排序 不包括n2 通过n1 n2 可以对
  • 已经有dll文件,报错:“缺少XXXXX.dll 无法继续执行代码。重新安装程序可能会解决此问题”解决方案

    解决方案 尝试了博客的很多方法 都建议直接复制dll到工程目录 觉得特别繁琐 而且会导致项目文件夹很大 从这篇文章得到启发 链接 项目 gt 属性 gt 调试 gt 环境 输入path 不要空格 你存储dll的目录 注意 不要有空格 例如我
  • MES相关名词解释

    SOA Service Oriented Architecture SOA 面向服务的体系结构AMR Advanced Manufacturing Research 先进制造研究机构CIM Computer Integrated Manuf
  • 【react】react全家桶介绍

    1 react基础 2 react router 路由库 3 pubsub 消息管理的库 4 redux 集中式状态管理的库 5 ant design UI库 react是用于构建用户界面的javascript库 1 发送请求获取数据 2
  • JAVA基础知识(五)

    5 4 构造方法 构造方法的主要作用就是为类中的属性初始化 类名称 对象名称 new 类名称 从格式中发现 在最后有一个类名称 的代码 在程序中只要是一看见有 就表示调用方法 那么这个方法实际上就是要表示调用构造方法 构造方法可视为一种特殊
  • 移动端如何浏览EXCEL、word、ppt、pdf等文件在线预览?

    1 简单的前端处理方式 a href 文档地址 a 或者JS window open 文档地址 新建窗口打开链接预览 window location href 文档地址 本页面内跳转链接实现预览 这种方式在不同浏览器上表现不一样 部份手机浏
  • 对所有数据类型可通用的快速排序算法

    1 引子 快速排序算法可能是最优秀的排序算法了 此算法是1960年C A Hoare发明出来的 它被列为20世纪十大算法之一 快速排序也属于广义上的冒泡排序 这是简单冒泡排序法的优化升级 两者都是通过比较大小 交换元素来排序的 不过它增大了
  • 如何构建Python软件包并上传到Pypi

    因为最近在做Python包 所以也了解了一下这个 这里我把我自己的学习经验写出来 如果哪里写的不好也请大家提出来 本文的内容大多数都来自 Packaging Python Projects Pypi 我根据我的理解进行描述一下 演示配置 操