这篇文章的目标读者是想要发布一个 Python 包的 Python 新手,以及我自己 – 一个时不时查看自己笔记的人。
对于发布一个 Python 包这件事,最佳实践应该是直接查看官方文档:Packaging and Distributing Projects 因为这里是二手知识,只是一份总结,记录了一些要点,一些坑。
会尽可能与最新的,最佳实践同步。
Requirements / 前提条件
工具
- pip
- setuptools
- wheel
- twine 用于上传 Python 包
具体步骤
打包
直接使用源码发布
1 | python setup.py sdist |
安装的时候进行编译,安装包会比较小。
使用 wheels 发布
1 | python setup.py bdist_wheel --universal # Universal Wheels |
打包 Python 代码和扩展 C 语言的一个相对新的方法,它发布的是已经编译好的包,安装包相对源码发布要大,但是安装时不需要编译,所以安装更快。它包括了通用 Wheels,纯 Python Wheels 以及平台 Wheels 这几种类型的 Wheels。通用 Wheels 不包含编译模块扩展,同时支持 Python2 Python3,纯 Python Wheels 不包含编译模块扩展,选择性支持 Python2 和 Python3,平台 Wheels 选择性支持 Linux,macOS,Windows 平台。
更详细的介绍请查阅:https://packaging.python.org/tutorials/distributing-packages/#wheels
上传
Python 社区推荐使用 twine 进行上传,可以通过 pip install twine
安装。
pypi 账户
在官网注册一个 ID: https://pypi.python.org/pypi?:action=register_form
账户信息可以写到 ~/.pypirc
里面
1 | [distutils] |
上传 Python 包
1 | twine upload dist/* |
注意事项
- 400 Client Error: This filename has previously been used, you should use a different version.
包名加版本号是这个互联网上关于你这个包的唯一标示,你的包一旦上传了,如果你进行了修改,除了更新版本号再上传没有其他办法,即使你在 pypi 的后台页面删除了该版本也不行,上传的包名是永久的。其实很容易理解,你总不想你的用户们抱怨在不同时间段下载了同一个版本的包,但运行行为不一样吧?版本号按照 <major>.<minor>.<patch>
的格式,修改一下版本号再上传就行。