1. PyPi的用途
Python中咱们常常会用到第三方的包,默认状况下,用到的第三方工具包基本都是从Pypi.org里面下载。html
咱们举个栗子: 若是你但愿用Python实现一个金融量化分析工具,目前比较好用的金融数据来源是 Yahoo 和 Google。
你可能须要读取这 2 个平台的 API,而后依次实现下载、分析数据的代码。
是否是好麻烦,这样你能够到 PyPi 到上面去找找有没有已经写过这个内容,幸运的是,你真找到了,你找到了一个 package 叫作 yfinance
。
python
https://github.com/ranaroussi/yfinance
这个时候你只须要一个命令,免除了咱们从头实现的麻烦:git
pip install yfinance
就能够了,是否是很是方便。github
PyPI
是 Python Package Index 的首字母简写,其实表示的是 Python 的 Packag 索引,这个也是 Python 的官方索引。
markdown
须要先再本地环境安装pip,而后若是要安装其余工具包的话就使用指令:工具
pip install <package name>
官方地址:https://pypi.org/
测试
一句话解释:若是你使用的是 Java 项目的话,你就将 PyPi 理解成 Maven 就好了。ui
那咱们如何将本身开发的一个包上传到PyPI,供其它人使用呢。url
2.Python包发布步骤
下面就开始介绍如何将本身的Python项目发布到PyPIspa
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 准备文件
接下来咱们来逐一编写除了代码之外的文件。
一、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.
二、LICENSE.txt,建立许可证
上传到Python Package Index的每一个包都包含许可证,这一点很重要。这告诉用户安装你的软件包可使用您的软件包的条款。
开源License,有如MIT,Apache license 2.0等。有关选择许可证的帮助,请访问https://choosealicense.com/
。选择许可证后,打开 LICENSE并输入许可证文本。
三、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。
一、准备好上面的步骤, 一个包就基本完整了, 剩下的就是打包了,可使用下面命令打包一个源代码的包:
python setup.py sdist build
这样在当前目录的dist文件夹下, 就会多出一个tar.gz结尾的包了:
二、也能够打包一个wheels格式的包, 使用下面的命令就能够了:
python setup.py bdist_wheel --universal
这样会在dist文件夹下面生成一个whl文件.
三、或者从setup.py位于的同一目录运行此命令:
python3 setup.py sdist bdist_wheel
上面的命令会在dist目录下生成一个tar.gz的源码包和一个.whl的Wheel包。
2.5 发布包到PyPi
一、接下来就是去https://pypi.org/account/register/
注册帐号,若是有帐号的请忽略,记住你的帐号和密码,后面上传包会使用。
二、接下来就是上传你的包了,这里使用twine上传。
须要先安装twine(用 twine上传分发包,而且只有 twine> = 1.11.0 才能将元数据正确发送到 Pypi上)
pip install twine
三、安装完以后,运行下面的命令将库上传,上传包,期间会让你输入注册的用户名和密码
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/