发布自己的Python包(Pypi)

2023-11-18

发布自己的Python包(Pypi)

我们经常使用 Pypi 来安装包,但是有时候我们也想要发布自己的 Pypi 包,有可能我们写了一个特别牛的包,也有可能我们只是想使用自己常用的一些轮子,可能这是我们日常编码中很常用的一些轮子,我们在不同工程目录、不同设备上都会频繁使用的一些接口,可能我们自己对这些自己常用的接口很熟悉,但是却因为环境的迁移而需要重复地实现,这时我们就可以发布一个自己的 Pypi 包,在环境迁移时使用熟悉的轮子只需要 pip install *** 即可。

就算这些轮子我们可能实现的没有那么完美,”不足为外人道也“,但却是我们最熟悉的,接口早已了然于心,因此这样使用起来会很方便。

发布

注册Pypi账号

没什么好多说的,出奇的简单,不需要任何多余的东西,邮箱、用户名、密码即可。链接如下:

https://pypi.org/

开发自己的包

假设我想发布一个包,里面有我们常用的一些使用函数,包名称为 SongUtils,我们先完成功能的开发,都在 SongUtils 目录下,得到目录结构如下:

├── SongUtils
│   ├── AVAUtils.py
│   ├── ImgUtils.py
│   ├── MetricUtils.py
│   ├── README.md
│   └── __init__.py

__init__ 文件是必须的,这是一个package的象征,可以什么都不写,但必须有。

准备setup.py

setup.py 是构建我们的Python包的关键,它的位置与我们的整个工程目录同级,包含了我们这个包的一些关键信息和依赖等,简单的可以参考下面笔者第一次发布包时的 setup.py 文件内容,其中各项看其名称即可一目了然,更详细的各项参数的含义网上其他博客也有介绍,在此不再赘述:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from setuptools import setup, find_packages            #这个包没有的可以pip一下

setup(
    name = "SongUtils",      #这里是pip项目发布的名称
    version = "0.0.1",  #版本号,数值大的会优先被pip
    keywords = ["pip", "SongUtils"],			# 关键字
    description = "Junjie's private utils.",	# 描述
    long_description = "Junjie's private utils.",
    license = "MIT Licence",		# 许可证

    url = "https://github.com/Adenialzz/SongUtils",     #项目相关文件地址,一般是github项目地址即可
    author = "Adenialzz",			# 作者
    author_email = "********@***.com",

    packages = find_packages(),
    include_package_data = True,
    platforms = "any",
    install_requires = ["numpy", "pillow"]          #这个项目依赖的第三方库
)

本地打包

完成 setup.py 文件后,我们的目录树如下:

├── SongUtils
│   ├── AVAUtils.py
│   ├── ImgUtils.py
│   ├── MetricUtils.py
│   ├── README.md
│   └── __init__.py
└── setup.py

然后在 setup.py 所在目录下,我们运行它来将项目本地打包:

python setup.py sdist  

没有问题的话,在打包之后我们会得到如下目录树:

├── SongUtils
│   ├── AVAUtils.py
│   ├── ImgUtils.py
│   ├── MetricUtils.py
│   ├── README.md
│   └── __init__.py
├── SongUtils.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   ├── requires.txt
│   └── top_level.txt
├── dist
│   └── SongUtils-0.0.1.tar.gz
└── setup.py

上传到Pypi服务器

首先在setup.py这一级的目录下建立一个系统文件 .pypirc 内容如下:

[distutils]
index-servers = pypi

[pypi]
username:你的PyPi用户名
password:你的PyPi密码

这里的用户名密码,就是我们第一步注册时的账号。

然后安装一个上传的工具来上传即可:

pip install twine
twine upload dist/SongUtils-0.0.1.tar.gz

验证

至此我们整个Python包的发布过程就已经完成了,我们可以(在其他机器)安装来验证一下:

pip install SongUtils

然后准备一个测试文件:

# test.py
import SongUtils

# Call you functions to evaluate.

在测试文件中调用自己包中的函数,看测试是否正常工作:

python test.py

删除

如果你想删除自己的 Pypi 包,只需要登陆到自己的 Pypi 网站的账户,并进入到自己想要删除的项目,然后选择对应版本,点击 Optins -> Delete 即可,过程中会要求你输入删除的版本号来防止误删除,在删除后也会给你的邮箱发送邮件提醒。

但是,这不是一个好主意,因为前一个软件包的所有用户都会看到他们的安装失败。

如果要弃用程序包,可以执行的操作是使用指向新程序包的README发布最后一个发行版。有人为python-cli-ui做了那个,它被替换为cli-ui

你也可以:

  • setup.py运行时添加警告
  • 或在导入时
  • 或者用一个取决于新名称的虚拟包替换包。

说明

这个过程只是一个简单的 Python 包的发布过程,在过程中其实有许多需要注意的地方,比如 setup.py 文件应当写的更加规范,整个包内的代码也应当更加规范,应当有一个比较好的 Description 或者 README.md 文档等等。这就留在以后有机会再说吧。

扩展阅读:

python打包发布pypi踩坑记(最新贴心版本,认真对待自己的库)

Ref:

https://www.cnblogs.com/suoyike1001/p/15216699.html

https://cloud.tencent.com/developer/ask/208868

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

发布自己的Python包(Pypi) 的相关文章

  • 如何在 PyCharm 中“查看”/突出显示制表符和空格以检查缩进?

    这可能听起来很愚蠢 但我还是个新手 有没有明确的方法可以发现 PyCharm 中的制表符或空格位于错误的位置 或者甚至以可视方式显示所有制表符和空格 我只是花了很长时间在函数的 Def 行寻找 无效语法 错误的问题 我原以为这可能仍然是一些
  • Python ImageTk.PhotoImage 使用 alpha 通道缓慢加载 png

    我编写了一个小程序来加载和显示图像 一切正常 直到我到达 示例中的 png 文件 shade png 显示这张小图片需要七七秒 PhotoImage 是否有错误或者我错过了一些 范围 这是我的示例代码 from PIL import Ima
  • 如何向数据添加填充以使其可以接受 pycrypto 库中的 AES256 加密算法

    有人可以告诉我如何向数据添加填充 使其可以接受 pycrypto 库 Python 中的 AES256 加密算法 提前非常感谢 看着文档 http www dlitz net software pycrypto doc 看来要由图书馆用户自
  • 如果新文件不存在则写入新文件,如果存在则追加到文件

    我有一个程序可以写入用户的highscore到一个文本文件 该文件由用户选择时命名playername 如果具有该特定用户名的文件已经存在 那么程序应该附加到该文件 以便您可以看到多个highscore 如果具有该用户名的文件不存在 例如
  • 在Python中将距离矩阵转换为成对距离列表[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设Python中有以下距离矩阵 0 1 2 3 0 0 1 4 8 1 1 0 3 7 2 4 3 0 3 3 8 7 3 0 我想
  • 如何在 django 表单中设置自定义 HTML 属性?

    我有一个 Django 表单 它是页面的一部分 假设我有一个字段 search input forms CharField u Search word required False 我只能通过模板访问它 form search input
  • 检查对象是否是字符串列表的列表?

    是什么elegant检查对象是否是字符串列表列表的方法 没有嵌套循环 也许这里必须是构造结构化迭代的常规方法 UPD 像这样的东西 l a b c d 1 3 e 2 f def recurse iterable levels result
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • 如何计算具有较大中间值的总和

    我想计算 for n m两个值都是 1000 以内的整数 最终结果是一个不大于 1000 的数字n但中间值对于 python 来说太大了 无法处理 你怎么解决这个问题 我将函数定义如下 from scipy misc import comb
  • python 中使用 scipy 截断正态分布

    我正在尝试使用截断正态分布scipy在Python3 我想做一些简单的事情 绘制以 0 5 为中心 范围从 0 到 1 的截断法线的 pdf 我有以下代码行 from scipy import truncnorm import matplo
  • 中断QThread睡眠

    我想知道如何暂停 QThread 然后在收到信号时恢复 我已阅读并知道我可以做这样的事情 def run self self ready False while not self ready self sleep 1 QtCore Slot
  • Django 中同一个模型的多个多对多关系

    给定以下具有两个多对多关系的模型 class Child models Model name models CharField max length 80 class Foo models Model bar models ManyToMa
  • Anaconda (Python) - Windows 10 上的 Cmder 集成

    我在 Windows 10 64 位上通过 Anaconda 让 Cmder 使用 Python 时遇到了一些麻烦 我让 Anaconda 工作得很好 测试过用 matplotlib 绘制一些东西 它与 Anaconda Prompt 一起
  • Python 中的“finally”总是执行吗?

    对于Python中任何可能的try finally块 是否保证finally块总是会被执行吗 例如 假设我在except block try 1 0 except ZeroDivisionError return finally print
  • python 中的优化标准化

    在优化过程中 对输入参数进行归一化 使它们处于同一数量级 通常会很有帮助 这样收敛效果会更好 例如 如果我们想要最小化 f x 而合理的近似值是 x0 1e3 1e 4 则将 x0 0 和 x0 1 归一化到大约相同的数量级可能会有所帮助
  • 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?

    有一天 我不得不恢复一个使用 OpenCV 3 和 Python 2 7 的旧项目 在此代码中 要加载 cv2 KeyPoint 我执行以下操作 import numpy as np import cPickle import cv2 ke
  • 将glade接口放入python中

    我在 Glade 中制作了一个 gui 我想将其放入 python 程序中 我正在调整我在网上找到的教程中的说明 以将其加载到我的林间空地文件中 http www pygtk org articles pygtk glade gui Cre
  • 纯Python库读写jpeg格式

    伙计们 我正在寻找 jpeg 写入 阅读会很好 但不是必需的 库的纯 python 实现 我只在以下位置创建了 TonyJPEG 库端口 http mail python org pipermail image sig 2004 Novem
  • FileAllowed 不显示错误消息

    我正在使用 WTForms 我正在对文件上传应用验证 并将其限制为仅 jpg png 和 pdf 格式 但是 如果我输入不正确 则不会出现错误消息 我按照这个教程https flask wtf readthedocs io en stabl
  • 每次 apache 重新启动时,flask-login 会话都会被破坏

    我正在使用烧瓶登录https github com maxcountryman flask login https github com maxcountryman flask login和领域记住登录用户 http packages py

随机推荐

  • Vue项目中使用@代替src——并在VScode中开启@路径自动提示

    这篇文章是为了记录一下项目里面经常使用的一个配置 路径别名 我自己个取的名 一般的 路径别名 src components src components 以上的路径别名的好处就是 当项目文件较多的时候 可以避免 这样的一层一层的回溯路径 当
  • findbugs使用_程序员技能与成长:使用静态代码分析工具和代码审查

    使用静态代码分析工具 前面的小节介绍了一些编码规范及最佳实践 如果在编码阶段可以很好地遵循这些规范 并践行最佳实践的话 就可以大大提升代码的质量 提高可读性 降低维护成本等 在很多公司内部及开发团队中 为了保证大家都遵循这些规范 都会有静态
  • SD卡容量变小后怎么恢复

    我是因为给linux板子刷系统 所以导致SD卡内存从16G变成了40MB 恢复方法 1 win r 启动命令行 2 输入diskpart回车 运行DISKPART 3 list disk回车 列出电脑的硬盘清单 4 看看你的u盘是哪一个 选
  • 【数据结构 002】 算法复杂度

    1 算法定义 Algorithm Defintion 2 算法特性 Algorithm Feature 输入 有0个或者多个输入 输出 至少1个或者多个输出 有穷性 算法在执行有限的步骤之后 会自动结束而不会出现无限循环 并且每个步骤都在可
  • 阿里资深架构师三年整理出:Java面试核心知识点原理篇文档

    本文是对Java程序员面试必备知识点的总结 详细讲解了JVM原理 多线程 数据结构和算法 分布式缓存 设计模式等内容 希望读者能通过阅读本书对Java的基础原理有更深入 全面的理解 面试官通常会在短短两小时内对面试者的知识结构进行全面了解
  • win电脑C/D盘清理技巧

    dir AD 查看当前路径下的所有文件夹 1 下载 和安装 磁盘文件占用空间分析工具TreeSize Free 可以查看某个目录下的每个文件 文件夹占用的磁盘空间大小 大文件夹使用win自带 的右键属性查看大小会耗时很久 2 把自己安装在C
  • 【华为OD机试真题】不开心的小朋友- python

    题目描述 不开心的小朋友 输入一个数代表摇摇车的数量 在下一行输入一串数字 用空格隔开 每个数字代表不同的小朋友的编号 小朋友的编号不能重复 每个小朋友只有一个编号 小朋友排队坐摇摇车 如果小朋友离开之前没有摇摇车坐视为不开心的小朋友 同现
  • mysql更新区间的数_解决针对MySQL中对于某一个区间段范围的数据更新的情况

    1 在使用更新update的过程中 我们可能会想要更新比如id段在某一个指定范围内的数据 如果我们是想要更新前面多少行的数据的话可以直接 UPDATE tb name SET column name value ORDER BY id AS
  • 华为OD机试 - 滑动窗口最大和 - 滑动窗口(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA
  • 配置多个TOMCAT

    1 把下载好的tomcat解压到想存放的目录 它不用安装的 在官网下载好 一解压就是了 2 打开电脑的 编辑环境变量 配置CATALINA HOME环境变量如图 我这里装了9和10 先配一个CATALINA HOME9 值是tomcat9的
  • Qt样式表-详解

    一 QT样式表简介 1 1 QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离 使得设计皮肤与界面控件分离的软件成为可能 QT样式表是允许用户定制widgets组件外观的强大机制 此外 子类化QStyle也可以定制widgets
  • Latex数学公式方程格式总结

    单行公式有自动标号 一般式子之间行距较大 begin equation T tilde nabla lim Delta v rightarrow 0 frac 1 Delta v left oint s T hat n mathrm d s
  • Java接口以及static和final关键字

    Java接口以及static和final关键字 一 static 二 final 三 让final元素可以初始化 不用固定赋值 四 接口 五 抽象方法 六 接口能够创建对象吗 匿名内部类 七 另一实例 开锁 一 static static代
  • OI考试中及平常练习里的一些低级错误总结

    long long相关 1 没开long long long long开少了 具体地 可能是未对题目可能产生的数值预估 可能是只写了int的读优 忽略long long 2 define int long long出锅 1 比如在遍历图的时
  • React中的性能优化

    1 所有的this指向都在constructor中绑定 就避免了多次绑定 this指向问题 只有当this指向我们定义的组件时才能去对state做修改 不去改变this指向 在该方法中this就指向undefined 2 setState是
  • ssm基于微信小程序的社区老人健康管理服务系统的设计与实现毕业设计源码011513

    摘要 随着现在网络的快速发展 网络的应用在各行各业当中它很快融入到了许多分类管理之中 他们利用网络来做这个社区老人健康管理服务系统 随之就产生了 社区老人健康管理服务系统 这样就让社区老人健康管理服务系统更加方便简单 对于本社区老人健康管理
  • Puzzles【Codeforces 697 D】【树形DP + 期望DP】

    Codeforces Round 362 Div 2 D 我们从1号结点开始 给每个结点标序 问的是每个结点的序号的期望是多少 输出这N个结点的期望 那么1号点的期望一定就是1了 对于其他的点呢 可以举例这样的一幅图 首先我们可以确定1 因
  • 基于UDP编程

    基于UDP编程 1 UDP是数据报协议 无连接的 不可靠 追求传输效率的一种通信协议数据的发送和接收是同步的 在进行通信之前 不需要建立连接 其传输效率比TCP高 对其服务器而言 并没有三次握手的过程 因此和TCP相比 少了被动监听 lis
  • Springboot实现发送邮件功能

    相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送 在Spring Boot的Starter模块中也为此提供了自动化配置 下面通过实例来讲解如何在Spring Boot中使用Ja
  • 发布自己的Python包(Pypi)

    发布自己的Python包 Pypi 我们经常使用 Pypi 来安装包 但是有时候我们也想要发布自己的 Pypi 包 有可能我们写了一个特别牛的包 也有可能我们只是想使用自己常用的一些轮子 可能这是我们日常编码中很常用的一些轮子 我们在不同工