实战教程:如何将自己的Python包发布到PyPI上

简介: 实战教程:如何将自己的Python包发布到PyPI上

1. PyPi的用途


Python中我们经常会用到第三方的包,默认情况下,用到的第三方工具包基本都是从Pypi.org里面下载。

我们举个栗子: 如果你希望用Python实现一个金融量化分析工具,目前比较好用的金融数据来源是 Yahoo 和 Google。你可能需要读取这 2 个平台的 API,然后依次实现下载、分析数据的代码。是不是好麻烦,这样你可以到 PyPi 到上面去找找有没有已经写过这个内容,幸运的是,你真找到了,你找到了一个 package 叫做 yfinance

https://github.com/ranaroussi/yfinance

这个时候你只需要一个命令,免除了我们从头实现的麻烦:

pip install yfinance

就可以了,是不是非常方便。

微信图片_20220526121508.pngPyPI 是 Python Package Index 的首字母简写,其实表示的是 Python 的 Packag 索引,这个也是 Python 的官方索引。

需要先再本地环境安装pip,然后如果要安装其他工具包的话就使用指令:

pip install <package name>

官方地址:https://pypi.org/

一句话解释:如果你使用的是 Java 项目的话,你就将 PyPi 理解成 Maven 就行了。

那我们如何将自己开发的一个包上传到PyPI,供其它人使用呢。

2.Python包发布步骤

下面就开始介绍如何将自己的Python项目发布到PyPI

2.1 创建目录结构

创建一个测试项目,例如project_demo,在该项目下,创建一个待发布的包目录,例如:package_mikezhou_talk,并在该project_demo目录下,依次创建:setup.pyLICENSEREADME.rst几项文件,此时目录结构为:

➜  project_demo tree -L 2
.
├── LICENSE
├── README.rst
├── package_mikezhou_talk
│   └── __init__.py
└── setup.py
1 directory, 4 files

2.2 准备文件

接下来我们来逐一编写除了代码以外的文件。

1、README.rst是关于项目的描述文件,一般包含怎样安装项目,怎样使用项目等。markdown 语法可以参考 https://rest-sphinx-memo.readthedocs.io/en/latest/ReST.html

打开README.rst并输入以下内容。可以自定义此项,放入一些对项目的介绍。

# Example Package
This is a simple example package. You can use
[联系作者](https://mp.weixin.qq.com/s/9FQ-Tun5FbpBepBAsdY62w)
to write your content.

2、LICENSE.txt,创建许可证

上传到Python Package Index的每个包都包含许可证,这一点很重要。这告诉用户安装你的软件包可以使用您的软件包的条款。开源License,有如MIT,Apache license 2.0等。有关选择许可证的帮助,请访问https://choosealicense.com/。选择许可证后,打开 LICENSE并输入许可证文本。微信图片_20220526121546.png

3、setup.py文件

setup.py是setuptools的构建脚本,用来描述项目,打包的时候会用到这个文件。它告诉PyPI我们的项目叫什么名字,是什么版本,依赖哪些库,支持哪些操作系统,可以在哪些版本的Python上运行,等等。

标准脚本示例:

from distutils.core import setup
from setuptools import find_packages
with open("README.rst", "r") as f:
  long_description = f.read()
setup(name='package_mikezhou_talk',  # 包名
      version='1.0.0',  # 版本号
      description='A small example package',
      long_description=long_description,
      author='mikezhou_talk',
      author_email='762357658@qq.com',
      url='https://mp.weixin.qq.com/s/9FQ-Tun5FbpBepBAsdY62w',
      install_requires=[],
      license='BSD License',
      packages=find_packages(),
      platforms=["all"],
      classifiers=[
          'Intended Audience :: Developers',
          'Operating System :: OS Independent',
          'Natural Language :: Chinese (Simplified)',
          'Programming Language :: Python',
          'Programming Language :: Python :: 2',
          'Programming Language :: Python :: 2.7',
          'Programming Language :: Python :: 3',
          'Programming Language :: Python :: 3.5',
          'Programming Language :: Python :: 3.6',
          'Programming Language :: Python :: 3.7',
          'Programming Language :: Python :: 3.8',
          'Topic :: Software Development :: Libraries'
      ],
      )

重要参数说明:

  • name:项目的名称,name是包的分发名称。
  • version:项目的版本。需要注意的是,PyPI上只允许一个版本存在,如果后续代码有了任何更改,再次上传需要增加版本号
  • author和author_email:项目作者的名字和邮件, 用于识别包的作者。
  • description:项目的简短描述
  • long_description:项目的详细描述,会显示在PyPI的项目描述页面。必须是rst(reStructuredText) 格式的
  • packages:指定最终发布的包中要包含的packages。
  • install_requires:项目依赖哪些库,这些库会在pip install的时候自动安装
  • classifiers:其他信息,一般包括项目支持的Python版本,License,支持的操作系统。

克隆setup.py仓库(推荐)

如果你觉得手写setup.py脚本文件难度大太,给你推荐另外一个简易方法。

大名鼎鼎的requests库的作者大神kennethreitz为大家准备了一个仓库作为一个setup.py的很好的模板,当然你也可以自己手写setup.py。

git clone  https://github.com/kennethreitz/setup.py

建议大家直接编辑之前的仓库里的setup.py, 只需要修改一些必要的配置就可以了。


2.3 编写核心代码


接下来我们就可以编写自己的代码了,要注意源代码文件夹(仓库里的package_mikezhou_talk包目录)的名字与setup.py里配置的包名(Name)要一致。

这一部内容,就根据各自的需求,自行实现即可。例如:我在示例package_mikezhou_talk包目录下,新建了一个main.py文件,在该文件下实现待实现的功能。

示例:

import itertools
case_list = ['用户名', '密码']
value_list = ['正确', '不正确', '特殊符号', '超过最大长度']
def gen_case(item=case_list, value=value_list):
    '''输出笛卡尔用例集合'''
    for i in itertools.product(item, value):
        print('输入'.join(i))
def test_print():
     print("欢迎搜索关注公众号: 「测试开发技术」!")
if __name__ == '__main__':
    test_print()

2.4 生成分发档案


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

确保您拥有setuptools并wheel 安装了最新版本:

python3 -m pip install --user --upgrade setuptools wheel

生成这前,可以先运行python setup.py check检查setup.py是否有错误,如果没报错误,则进行下一步输出一般是running check。

1、准备好上面的步骤, 一个包就基本完整了, 剩下的就是打包了,可以使用下面命令打包一个源代码的包:

python setup.py sdist build

这样在当前目录的dist文件夹下, 就会多出一个tar.gz结尾的包了:

2、也可以打包一个wheels格式的包, 使用下面的命令就可以了:

python setup.py bdist_wheel --universal

这样会在dist文件夹下面生成一个whl文件.

3、或者从setup.py位于的同一目录运行此命令:

python3 setup.py sdist bdist_wheel

上面的命令会在dist目录下生成一个tar.gz的源码包和一个.whl的Wheel包。

2.5 发布包到PyPi


1、接下来就是去https://pypi.org/account/register/注册账号,如果有账号的请忽略,记住你的账号和密码,后面上传包会使用。

2、接下来就是上传你的包了,这里使用twine上传。需要先安装twine(用 twine上传分发包,并且只有 twine> = 1.11.0 才能将元数据正确发送到 Pypi上)

pip install twine

3、安装完之后,运行下面的命令将库上传,上传包,期间会让你输入注册的用户名和密码

twine upload dist/*

输入 PyPI注册的用户名和密码。命令完成后,您应该看到与此类似的输出:

➜  twine upload dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Enter your username: mikezhou_talk
Enter your password:
Uploading package_mikezhou_talk-1.0.0-py3-none-any.whl
100%|██████████████████████████████████████| 7.84k/7.84k [00:03<00:00, 2.29kB/s]
Uploading package_mikezhou_talk-1.0.0.tar.gz
100%|██████████████████████████████████████| 6.64k/6.64k [00:01<00:00, 6.05kB/s]
View at:
https://pypi.org/project/package-mikezhou-talk/1.0.0/

上传完成后,我们的项目就成功地发布到PyPI了。

3.验证发布PYPI成功


上传完成了会显示success,我们直接可以在PyPI上查看,如下:

微信图片_20220526121652.png您可以使用pip来安装包并验证它是否有效。创建一个新的virtualenv (请参阅安装包以获取详细说明)并从TestPyPI安装包:

python3 -m pip install --index-url https://test.pypi.org/simple/ package-mikezhou-talk
pip install package-mikezhou-talk -i https://www.pypi.org/simple/

如下图所示:微信图片_20220526121733.png

进入Python Shell验证结果如下:微信图片_20220526121748.png

至此,我们已经成功地将自己开发的Python程序发布到了PyPI,此时你,可以直接在你本地的环境通过pip命令安装示例中的package-mikezhou-talk这个包了。

官网地址:

https://pypi.org/project/package-mikezhou-talk/1.0.0/
目录
相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
352 7
|
2月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
2月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
330 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
2月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
2月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
117 12
|
2月前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
130 1
|
2月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
343 1
|
2月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
551 1
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
290 0
|
2月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
382 0

推荐镜像

更多