发布一个-python-包

总结一下发布一个 Python 包这件事。

这篇文章的目标读者是想要发布一个 Python 包的 Python 新手,以及我自己 – 一个时不时查看自己笔记的人。

对于发布一个 Python 包这件事,最佳实践应该是直接查看官方文档:Packaging and Distributing Projects 因为这里是二手知识,只是一份总结,记录了一些要点,一些坑。

会尽可能与最新的,最佳实践同步。

Requirements / 前提条件

工具

具体步骤

打包

直接使用源码发布

1
python setup.py sdist

安装的时候进行编译,安装包会比较小。

使用 wheels 发布

1
2
python setup.py bdist_wheel --universal  # Universal Wheels
python setup.py bdist_wheel # Pure Python Wheels 或 Platform 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
2
3
4
5
6
[distutils]
index-servers=pypi

[pypi]
repository = https://upload.pypi.org/legacy/
username = <username>

上传 Python 包

1
twine upload dist/*

注意事项

  • 400 Client Error: This filename has previously been used, you should use a different version.

包名加版本号是这个互联网上关于你这个包的唯一标示,你的包一旦上传了,如果你进行了修改,除了更新版本号再上传没有其他办法,即使你在 pypi 的后台页面删除了该版本也不行,上传的包名是永久的。其实很容易理解,你总不想你的用户们抱怨在不同时间段下载了同一个版本的包,但运行行为不一样吧?版本号按照 <major>.<minor>.<patch> 的格式,修改一下版本号再上传就行。

Reference / 参考文档