PyPI
PyPI(英语:Python Package Index,简称PyPI)是一个用于存储Python写成的软件包的软件存储库,我们平时用pip安装的库就是来自于PyPI
而且,通过PyPI我们可以把自己写的库代码分享给别人,这也是开源的乐趣之一。
用到的库代码
1  | ├── MANIFEST.in  | 
整体代码结构,其中dingtalk_log_handler是我写的一个用于发日志到钉钉群的库,也是这次要发布的库。
先看下库的主体代码dingtalk_log_handler/__init__.py, 由于功能比较简单,逻辑就都写在__init__.py里了
1  | import base64  | 
编写 setup.py
setup.py指引了打包工具如何打包我们的库,功能与类似Makefile
1  | from setuptools import setup, find_packages  | 
具体打包的功能由setuptools.setup函数实现,我们只需要修改对应的参数即可
这些参数影响打包的行为,以及在PyPI页面上显示的信息
主要的参数说明,详细信息参考文档
- name: 库名,也就是
pip install xxx时的名称 - version: 版本,我们这里是复用了库代码里的版本号
 - author: 作者,同上
 - author_email: 作者邮箱
 - description: 库说明,在
pip search xxx的时候可以看到 - long_description: 库详细说明,显示在PyPI完整上,我们这里从
README.md文件中读取具体内容 - long_description: 库详细说明的格式,这里使用markdown
 - classifiers: 库的类别信息,所有可选值参考
 - packages: 库包含的python包,通过find_packages自动添加
 - py_modules: 库包含的顶级Python模块,我们这里没有
 - python_requires: 支持的Python版本
 - install_requires: 依赖的其他库,格式与
pip freeze输出的格式相同 - project_urls: 项目的一些链接信息,可选值列表
 
编写 MANIFEST.in
打包时默认只会包含包代码和一些必要的文件,见列表
如果要包含其他资源文件,必须编写MANIFEST.in来说明说明
MANIFEST.in1
2
3
4
5include README.md
recursive-include dingtalk_log_handler *
global-exclude __pycache__
global-exclude tmp
global-exclude *.py[co]
语法和shell的通配符语法类似
include <pattern> <pattern2> ...: 包含项目根目录匹配通配符的文件recursive-include <dir-pattern> <pattern> <pattern2> ...: 递归地包含指定目录匹配通配符的文件global-exclude <pattern> <pattern2> ...: 递归地排除匹配通配符的文件
打包
执行: pip3 install wheel && python3 setup.py sdist bdist_wheel
输出文件1
2
3dist
├── dingtalk-log-handler-0.0.2.tar.gz
└── dingtalk_log_handler-0.0.2-py3-none-any.whl
上传
我们可以通过PyPI的测试站点 来练习库文件的上传,并测试效果
- 注册账户
 - 安装上传工具:
pip install twine -U - 上传文件:
twine upload --repository testpypi dist/* 
熟悉流程之后,就可以换成正式站点,指定正式仓库(–repository pypi)上传文件
这样全世界的人都能看到你的库了。
效果
可以在这里找到我这次上传的库
可以看到 setup.py 文件里的很多信息会对应体现在PyPI网页上