如何编写Github Action和setup.py并实现自动化上传PyPI

0 前言

鄙人平时会写点开源代码,并且个人维护了一个叫IDDM: Integrated-Design-Diffusion-Model的开源仓库。作为一个忙里偷闲的懒狗程序员,前些日子想给自己的代码做一个巨大的更新——上传PyPI平台(内心OS:这样就可以执行pip install iddm下载了)。

然而!来自懒狗的认知里,在维护代码的时候不想做一些重复性非常高的方法。众所周知,Github是一个自动化流程很高的平台,那么编写一套setup.py代码和Github Action流程就迫在眉睫。 文章最新更新日期:2025年3月11日15:37:42

1 准备工作

1.1 标准文件格式准备

想要打包成PyPI的格式,首先应该将你的项目文件重构到一个目标文件夹中。以IDDM为例,在1.1.8版本之前,所有的py文件均在主目录下,如图所示:

1.1.8版本之前的目录结构

鄙人在实践中发现这是一种打包上传PyPI很蠢的结构,为什么会这么说呢?在执行python -m build的时候,这玩意生成的whl文件不会给你创建文件夹,而是直接打包到整体目录下,这样你安装pip的时候,环境会直接将所有文件夹安装到site-packages下面(就很蠢,会让你导包的时候找不到你想导入的东西),如图所示:

错误的打包版本

正常来说,我们应该重构一个文件夹作为打包的入口文件夹,例如IDDM的1.1.8版本,如图3所示:

1.1.8版本创建打包主文件夹

在需要打包的文件夹中创建__init__.py文件(所有文件夹都需要有__init__.py文件,不然不识别),该文件的作用是告诉打包程序,这是需要打包的文件夹,文件夹结构如图所示:

init.py文件夹结构

1.2 环境准备

针对于打包,我么需要准备build这个PyPI包,安装方法如下:。

1
pip install build

检查一下自己项目的虚拟环境或物理环境。这里我们以IDDM项目环境为例,打包项目所需的前置环境如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
coloredlogs==15.0.1
gradio==5.0.0
matplotlib==3.7.1
numpy==1.25.0
Pillow==10.3.0
Requests==2.32.0
scikit-image==0.22.0
torch_summary==1.4.5
tqdm==4.66.3
pytorch_fid==0.3.0
fastapi==0.115.6
tensorboardX==2.6.1

# 如果你想下载GPU版本请使用:pip install torch==1.13.0+cu116 torchvision==0.14.0+cu116 -f https://download.pytorch.org/whl/torch_stable.html
# 想了解更多信息请访问:https://pytorch.org/get-started/previous-versions/#linux-and-windows-25
# 更多版本请访问:https://pytorch.org/get-started/previous-versions
# 需要注意torch版本 >= 1.9.0
torch>=1.9.0 # 更多信息:https://pytorch.org/get-started/locally/ (推荐)
torchvision>=0.10.0 # 更多信息:https://pytorch.org/get-started/locally/ (推荐)

2 代码编写

2.1 setup.py文件编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from setuptools import setup, find_packages

def get_long_description():
with open(file="README.md", mode="r", encoding="utf-8") as f:
long_description = f.read()
return long_description

if __name__ == "__main__":
# 安装需要的包
package_list = [
"coloredlogs==15.0.1",
"gradio==5.0.0",
"matplotlib==3.7.1",
"numpy==1.25.0",
"Pillow==10.3.0",
"Requests==2.32.0",
"scikit-image==0.22.0",
"torch_summary==1.4.5",
"tqdm==4.66.3",
"pytorch_fid==0.3.0",
"fastapi==0.115.6",
"tensorboardX==2.6.1",
"torch>=1.9.0",
"torchvision>=0.10.0"
]
# 定义setup
setup(
name="iddm", # 发布包名称
version="1.1.8-b3", # 版本号,不能重复
packages=find_packages(), # 寻找你要打包的文件
python_requires=">=3.8", # Python要求
install_requires=package_list, # 安装需要的包
license="Apache-2.0", # 证书
description="IDDM: Integrated Design Diffusion Model", # 包描述
long_description=get_long_description(),
long_description_content_type="text/markdown",
author="chairc", # 作者
author_email="chenyu1998424@gmail.com", # 作者邮箱
url="https://github.com/chairc/Integrated-Design-Diffusion-Model", # 项目地址
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
],
project_urls={
"Documentation": "https://github.com/chairc/Integrated-Design-Diffusion-Model/blob/main/README.md",
"Source": "https://github.com/chairc/Integrated-Design-Diffusion-Model",
"Tracker": "https://github.com/chairc/Integrated-Design-Diffusion-Model/issues",
},
)

2.2 测试setup.py文件

别写了代码不进行测试!不然你就会像鄙人一样在之后的工作里成为小丑!!

执行以下命令进行测试,命令如下:

1
2
cd Integrated-Design-Diffusion-Model
python -m build

等待指令执行,出现Successfully built iddm-1.1.8b3.tar.gz and iddm-1.1.8b3-py3-none-any.whl,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
* Creating isolated environment: venv+pip...
* Installing packages in isolated environment:
- setuptools >= 40.8.0
* Getting build dependencies for sdist...
...
中间忽略
...
* Building wheel from sdist
* Creating isolated environment: venv+pip...
* Installing packages in isolated environment:
- setuptools >= 40.8.0
* Getting build dependencies for wheel...
...
中间忽略
...
adding 'tools/__init__.py'
adding 'iddm-1.1.8b3.dist-info/LICENSE'
adding 'iddm-1.1.8b3.dist-info/METADATA'
adding 'iddm-1.1.8b3.dist-info/WHEEL'
adding 'iddm-1.1.8b3.dist-info/top_level.txt'
adding 'iddm-1.1.8b3.dist-info/RECORD'
removing build\bdist.win-amd64\wheel
Successfully built iddm-1.1.8b3.tar.gz and iddm-1.1.8b3-py3-none-any.whl # 出现这个就成功了

现在我们再次查看whl文件的格式,如下:

正确的whl文件格式

此时我们执行以下指令进行本地安装,如下:

1
2
cd Integrated-Design-Diffusion-Model
pip install ./dist/iddm-1.1.8b3-py3-none-any.whl

使用一个小demo进行测试,如下:

测试IDDM的demo

很好,我们测试本地发布+安装iddm成功,说明之后发布到PyPI上的包也是基本没有问题的!

上传代码至Github仓库

1
2
3
git add .
git commit -m "提交setup.py"
git push origin main # 可以直接推仓库,但我建议先push到dev分支,再提交PR进行合并

2.3 Github Action编写

这一步相对于简单,打开Github仓库页面,点击Actions

打开Actions

点击New workflow,创建新的工作流,如下:

创建新的工作流

选择Publish Python Package中的Configure

创建Pip

网上有很多版本都要去PyPI申请token,因为Github提交PyPI都已经更新好几版本了,Github官方和PyPI官方都给我们写好了,我们直接commit这个文件就好了,如下:

编写pip工作流

3 上传发布

3.1 绑定PyPI

工作流提交完毕后,我们需要去PyPI创建一个账号,和现在这个项目进行绑定,如下:

publishing 添加项目

3.2 发布版本

此时,我们的项目就已经添加到PyPI中了,在每次发布Release包的时候Github Action会自动build我们的程序并上传PyPI仓库,例如我们发布一个iddm v1.1.8-beta.3

自动打包 打包明细

鄙人的iddm包就发布到了PyPI中了

PyPI官方

4 下载运行

4.1 pip下载

试着下载一下pip包

1
pip install iddm

运行结果如下:

pip安装

如何编写Github Action和setup.py并实现自动化上传PyPI
https://chairc.cn/2025/04/04/如何编写Github-Action和setup-py并实现自动化上传PyPI/
作者
chairc
发布于
2025年4月4日
许可协议