实战教程:如何将自己的Python包发布到PyPI上
1. PyPi的用途
Python中我们经常会用到第三方的包,默认情况下,用到的第三方工具包基本都是从Pypi.org里面下载。
我们举个栗子: 如果你希望用Python实现一个金融量化分析工具,目前比较好用的金融数据来源是 Yahoo 和 Google。
你可能需要读取这 2 个平台的 API,然后依次实现下载、分析数据的代码。
是不是好麻烦,这样你可以到 PyPi 到上面去找找有没有已经写过这个内容,幸运的是,你真找到了,你找到了一个 package 叫做 yfinance
。
https://github.com/ranaroussi/yfinance
这个时候你只需要一个命令,免除了我们从头实现的麻烦:
pip install yfinance
就可以了,是不是非常方便。
PyPI
是 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.py
、LICENSE
、README.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并输入许可证文本。
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上查看,如下:
您可以使用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/
如下图所示:
进入Python Shell验证结果如下:
至此,我们已经成功地将自己开发的Python程序发布到了PyPI,此时你,可以直接在你本地的环境通过pip命令安装示例中的package-mikezhou-talk
这个包了。
官网地址:
https://pypi.org/project/package-mikezhou-talk/1.0.0/
实战教程:如何将自己的Python包发布到PyPI上的更多相关文章
- 如何将你自己的Python package发布到PyPI上
零.前言 最近做了一个小工具,查询IP或者域名的归属地.做完之后想发布到PyPI上,这样大家就可以通过pip来安装了. 在发布的过程中遇到了一些问题,也学到了很多东西.记录到这篇文章中.希望对大家有所 ...
- 将python包发布到PyPI和制作whl文件
参考链接:wheel和egg的不同怎样将自己写的包传达到PyPi发布你自己的轮子 - PyPI打包上传实践PyPI官网上传包教程 wheel文件Wheel和Egg都是python的打包格式,目的是支持 ...
- 将自己写的Python代码打包放到PyPI上
如果是开源的Python代码,为了能够让大家更方便的使用,放到PyPI上也许是个非常不错的主意(PyPI:Python Package Index).刚开始我以为要将代码打包放到PyPI上是一件非常复 ...
- composer包(发布到github上)同步到Packagist
在上一篇文章里面,探讨了如何一步步建立composer包–创建你的一个composer包 创建完成后,我们需要做的就是讲自建的包发布到Packagist上.至于说什么是Packagist,这个就不用我 ...
- 纯Python包发布setup脚本编写示例
如果你有多个模块需要发布,而它们又存在于多个包中,那么指定整个包比指定模块可能要容易地多.即使你的模块并不在一个包内,这种做法也行的通:你可以告诉Distutils从根包(root package)处 ...
- 如何将Python项目发布到PyPI
The Python Package Index (PyPI) is a repository of software for the Python programming language. 如何打 ...
- 使用idea创建springboot项目并打成war包发布到weblogic上
部署tomcat也是类似的,但是需要注意项目配置的路径,或者直接将项目放到webapp的ROOT目录下. 使用工具:intelliJ IDEA2016.3, jdk1.8 ,weblogic12 一 ...
- Python—包管理工具与上传工具
https://blog.csdn.net/libbyandhelen/article/details/78808959 https://www.cnblogs.com/nineep/p/947529 ...
- 使用idea创建springboot项目并打成war包发布到tomcat8上
1.将pom.xml中的打包方式修改为war <groupId>com.borya</groupId> <artifactId>Project</artifa ...
随机推荐
- Semaphore(信号灯)
public class SemaphoreDemo { public static void main(String[] args) { //三个停车位 Semaphore sp = new Sem ...
- 21个写SQL的好习惯,你值得拥有
前言 每一个好习惯都是一笔财富,本文分SQL后悔药, SQL性能优化,SQL规范优雅三个方向,分享写SQL的21个好习惯,谢谢阅读,加油哈~ 公众号:捡田螺的小男孩 1. 写完SQL先explain查 ...
- JWT实现过程及应用
jwt实现过程 # 用户登录,返回给客户端token(服务端不保存),用户带着token,服务端拿到token再校验; 1,提交用户名和密码给服务端,如果登陆成功,jwt会创建一个token,并返回; ...
- python中使用with操作文件,为什么不需要手动关闭?
python中的with关键字,它是用来启动一个对象的上下文管理器的.它的原理是,当我们使用with去通过open打开文件的时候,它会触发文件对象的上下文管理器, 当with中的代码结束完成之后,去自 ...
- STM32入门系列-复位程序
已经对启动文有了大致了解,再来看看系统在复位过程中做了哪些工作.复位程序如下: 1 ; Reset handler 2 3 Reset_Handler PROC 4 5 EXPORT Reset_Ha ...
- Flutter源码剖析(一):源码获取与构建
概述 本文介绍了Flutter源码的获取与构建,后面会另有文章介绍Flutter源码的版本管理.开发环境搭建等主题. 准备工作 Flutter源码分为两个部分: flutter/flutter是框架层 ...
- Flink的DataSource三部曲之三:自定义
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- docker部署redis主从和哨兵
docker部署redis主从和哨兵 原文地址:https://www.jianshu.com/p/72ee9568c8ea 1主2从3哨兵 一.前期准备工作 1.电脑装有docker 2.假设本地i ...
- 1到n整数中1出现的次数
1到n整数中1出现的次数 题目描述 输入一个整数n, 求1~n这n个整数的十进制表示中1出现的次数. 例如, 输入12, 1~12这些整数中包含1的数字有1, 10, 11和12, 1一共出现了4次 ...
- margin的讲究
什么元素允许有margin值,无论块状元素还是行内元素都可以,只是各有限制. 先说行内元素,这个是不允许有上下 外边距的, 再说块状元素,上下左右外边距都允许 但是相邻元素的外边距会合并,要注意的是 ...