Python项目打包
Python项目如何打包?
本指南总结了Python项目打包的最佳实践,主要涉及代码的打包和分发,以及环境和依赖的管理。
0. 一般项目清单
- 源代码(可使用git托管)
- 数据包(可使用DVC托管)
- Docker环境镜像(可使用docker hub托管)
1. 代码打包
- 使用 setuptools: 对于 Python 代码,使用 setuptools 创建一个 setup.py或pyproject.toml 文件,它描述了你的项目及其依赖。这允许其他人使用 pip install 来安装你的项目。我们以toml为例,展现一个基本的启动文件:(关于toml文件的更多解释可参考基于pyproject.toml的包管理(setuptools))
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "apss"
version = "0.3.0"
description = "一种基于神经网络和启发式策略的深度学习模型分布式训练切分(3D parallelism)快速策略搜索算法"
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
"Programming Language :: Python :: 3",
]
dependencies = [
"mindspore>=2.1.1",
"tensorboard_logger",
"numpy",
"tqdm",
]
[project.urls]
"Homepage" = "https://github.com/Cheny1m/APSS"
[tool.setuptools.packages.find]
exclude = ["benchmark*","dist*","script*"]
[tool.wheel]
exclude = ["benchmark*","dist*","script*"]
- 结构化你的项目: 确保你的项目有一个清晰的结构。通常包括源代码目录(如 src 或项目名称)、测试目录(tests或benchmark)、文档目录(docs)、自动化脚本目录(scripts)等。
- 包含必要的文件: 除了源代码外,还应该包括 README.md(项目说明)、LICENSE(许可证)、.gitignore(Git 忽略规则)、config.json(可能的配置设置)、requirements.txt(可能的依赖提示)等文件。
# .gitignore例子
# data & log & output
resource/
# built binaries
dist
# vscode
.vscode/
# cache
*__pycache__
*.egg-info
# pickle
*.pkl
2. 数据和资源
- 分离大型数据: 如果项目包含大型数据文件或其他资源(如图像、模型等),最好不要直接包含在代码包中。可以将它们托管在网络上,如云存储(AWS S3、Google Cloud Storage 等),并在文档中提供下载链接或脚本。
- 使用数据管理工具: 对于数据科学项目,考虑使用如 DVC(Data Version Control)之类的工具协同git来管理数据。
3. 环境和依赖管理
- requirements.txt: 为项目创建一个 requirements.txt 文件,列出所有的依赖项,以便其他人可以使用 pip install -r requirements.txt 来安装依赖。
- 使用虚拟环境: 推荐在开发时使用虚拟环境(如 venv 或 conda),这有助于隔离依赖并确保项目的可移植性。
- 考虑使用 Docker: 对于更复杂的项目,尤其是涉及多个服务或特定系统依赖时,考虑使用 Docker 容器来打包你的应用及其环境。打包好的docker可以上传至docker hub供用户下载。
4. 文档和示例
- 写明确的文档: 提供清晰、详细的文档,说明如何安装、配置和使用你的项目。如果可能,包括一些示例和教程。
- 包含运行示例: 提供一些示例脚本或 Jupyter 笔记本,展示如何使用你的项目。
5. 测试和持续集成
- 编写测试: 为你的代码编写单元测试和(如果适用)集成测试。
- 设置 CI/CD: 考虑使用持续集成/持续部署(CI/CD)工具,如 GitHub Actions 或 Travis CI,来自动化测试和部署流程。
6. 发布到 PyPI
- 发布包: 如果你的项目是一个库,并且你希望它被广泛使用,可以考虑将其发布到 PyPI 上,让人们可以通过 pip 直接安装。自动化脚本upload_pypi.sh:
rm -rf dist
python3 -m build
python3 -m twine upload dist/*
7. 版本控制
- 使用 Git: 使用 Git 进行版本控制,并在 GitHub 或其他平台上托管代码,这不仅有助于团队协作,也方便分享和反馈。
8. 遵守开源协议
- 选择合适的许可证: 如果你打算开源你的项目,选择一个合适的开源许可证(如 MIT、GPL、Apache 等)。
9.验证打包是否正确(创建新环境)
- 使用Git拉取源代码和数据文件,使用docker下载好所需要的image。
- 启动docker容器并将源代码和数据文件映射进容器。
- pip安装项目(从源码构建 – 进入项目根目录后执行:pip install -e . ;如果上传到了pypi,可以使用pip install xxx)
- 执行主脚本,看是否能够正常运行。