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网页上