前言
本文以笔者实际发布的 python 包 imgkernel
为例。因此,在本文所有出现 imgkernel
的地方,都替换成读者自己项目或包的名称。 同时,imgkernel
也托管在 github 上,后续 master 分支会更新,但是项目单独检出的 pkg
分支将保持与本文内容一致,不再改动。因此,可以将此分支 clone
下来作为新项目启动工程。clone pkg
分支的方法如下:
1 | git clone -b pkg https://github.com/kenblikylee/imgkernel.git |
下面分步骤讲解 imgkernel
项目的创建,生成,发布测试,正式发布到 PyPi 和安装使用。
1. 创建github仓库
2. 克隆仓库到本地
1 | git clone https://github.com/kenblikylee/imgkernel.git |
3. 创建 setup.py
setup.py 是 setuptools 的构建脚本,告知 setuptools 包的名称和版本,以及哪些文件将被打包。
在项目根目录新建文件 setup.py ,复制黏贴如下代码到 setup.py:
1 | import setuptools |
4. 创建项目包 imgkernel
setup.py 会自动查找项目根目录下,包含文件 __init__.py 的子目录,作为项目的包,并以目录名称作为包名。这里只创建了一个与项目同名的包 imgkernel
,当然不是必须创建一个同名的包,事实上,可以创建任意名称的多个包。
创建后,整个项目目录结构如下:
1 | . |
imgkernel 包有三个文件: __init__.py
, imgconv.py
, kernels.py
,下面分别是三个文件的代码实现:
4.1 __init__.py
__init__.py 是包内部模块对外的导出接口,或者说,当使用 import
时的导入对象。 我们把需要提供外部应用使用的函数,数据,类等都放在这个文件里。当然,并非一定要此文件里实现,import
进来的模块也会被导出,例如下面的 kernels
下的所有 kernel 以及 imgconv
函数。
1 | from .kernels import * |
4.2 imgconv.py
1 | from PIL import Image |
4.3 kernels.py
1 | import numpy as np |
5. 生成包
先确保已经安装了最新版本的 setuptools, wheel, twine
1 | pip install --user --upgrade setuptools wheel twine |
生成项目包:
1 | python setup.py sdist bdist_wheel |
运行后,项目目录结构如下:
1 | . |
6. 上传包到 PyPI
6.1 注册 PyPI 测试账号
注册地址:https://test.pypi.org/account/register/
6.2 使用 twine 上传 dist 目录下的存档
1 | python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* |
打开: https://test.pypi.org/project/imgkernel/0.0.1/ 可看到,包已经成功发布到测试 PyPI。
7. 安装
1 | pip install --index-url https://test.pypi.org/simple/ --no-deps imgkernel |
使用 python 解释器测试包是否安装成功:
1 | $ python |
8. 正试发布!
如果在第6小节,是发布到 PyPI 的测试环境,这一步就是发布到 PyPI 生产环境。如果顺利完成上面的步骤的,发布正试 PyPI 也基本一样。需要注意的是,测试 PyPI 不是永久存储的,后台会定期清楚,而正试 PyPI 是永久存储的,且一旦发布,就不能修改,只能迭代新的版本,此外,还需要确保包名不能和已经发布的包重名。
正试和测试是独立的系统,因此,还需要注册一个账号, 注册地址:https://pypi.org
使用 twine 发布:
1 | python -m twine upload dist/* |
安装:
1 | pip install imgkernel |
结语
本文示例项目 github 地址:https://github.com/kenblikylee/imgkernel
使用方法:
1 | git clone -b pkg https://github.com/kenblikylee/imgkernel.git |
参考
- [1] Python Packaging User Guide
- [2] Packaging Python Projects