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包,安装方法如下:。
检查一下自己项目的虚拟环境或物理环境。这里我们以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
torch>=1.9.0 torchvision>=0.10.0
|
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( name="iddm", version="1.1.8-b3", packages=find_packages(), python_requires=">=3.8", 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
|
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
创建一个账号,和现在这个项目进行绑定,如下:

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

鄙人的iddm
包就发布到了PyPI
中了
PyPI官方
4 下载运行
4.1 pip下载
试着下载一下pip包
运行结果如下:
pip安装