其它章节
在实际项目开发过程中,采用标准化的项目打包与部署流程,将项目的版本管理,及时将正确版本发布到仓库,方便用户下载安装。对于商业项目,可以在云服务器上建立私有化PyPi Server, 实现在线发布, 提高部署效率。
Python本身还有1个优势,在掌握Python项目的打包与部署流程后,用Python很容易写1个适合自己项目的CI/CD脚本,结合Dockfile等步骤,完成版本监测、自动更新、自动测试、自动发布、部署等工作。
Python项目的打包与部署流程
- 创建与配置项目
- 打包项目
- 上传项目至PyPi 或 私有化仓库
- 下载与安装项目
项目发布组件
打包后,会生成两种主要的发布包(英文术语为:artifect)
- 源文件包: 即python源文件,简写为 sdist ,包含.py, 资源文件,数据文件等
- 二进制包, 编译后的二进制格式,通常为wheel 格式, 也可以将非python第3方库合并打包。其安装器是pip.
二进制包的两种格式:Wheel 与 Egg,Egg
格式是老的二进制包标准。 2004年setuptools引入了Egg格式,而2012年PEP 427引入了Wheel 格式。Wheel
是当前版本使用的二进制包封装标准。
3. 打包工具介绍
官方打包工具
- 最老的python打包工具是 distutils , 使用
setup.py
做为配置文件。 - 当前的打包工具: setuptools
setuptools 配置文件说明- pyproject.toml 是新版本的配置文件
- 老版本setuptools 使用
setup.py
做为配置文件。 当前大多数人仍然在使用 setup.py 做为项目包管理配置文件。
其它打包工具
- Poetry 工具
- Pipenv
- PDM
4. 打包步骤详解
为说明打包与部署步骤,本节使用 setuptools 打包工具, PyPi 公共包发行服务器。 当然可以选择其它工具、包发行服务器。
打包与部署流程图
流程图如下
PyPi 是Python 公共项目包管理库,可以注册帐号,可将自己的项目打包上传,之后可以用 pip下载安装,这是最基本,也是最方便的打包方式
1) 安装setuptools
安装命令
pip install --upgrade setuptools
更新build模块
pip install --upgrade build
2) 基本使用方式
创建1个 pyproject.toml
, 添加 build-system section 配置
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
通常,还需要添加更多section 配置段, metadata, contents, dependencies, etc。 这些内容也可以包含在 setup.cfg
文件里。
如 pyproject.toml
[project]
name = "mypackage"
version = "0.0.1"
dependencies = [
"requests",
'importlib-metadata; python_version<"3.8"',
]
setup.cfg
[metadata]
name = mypackage
version = 0.0.1
[options]
install_requires =
requests
importlib-metadata; python_version < "3.8"
3) 整理项目结构
可按如下结构组织项目文件
mypackage
├── pyproject.toml
| README.rst or README.md
| # LICENCE (properly chosen license information, e.g. MIT, BSD-3, GPL-3, MPL-2, etc...)
└── mypackage
├── __init__.py
└── ... (other Python files)
4) 编译项目
在 pyproject.toml 所以目录下,运行打包命令,
py -m build
此命令会自动搜索package 子目录, 生成sdist, wheel artifacts.
dist/
├── example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
└── example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz
其中: *.tar.gz 就是源文件包, .whl 是built distribution, 也就是编译后的二进制包。 安装时,pip优先安装 wheel 包。
指定源文件目录, 只生成sdist 包
python -m build --sdist source-directory
商业项目,如果不需要发布源码,可以只生成 wheel 包,
python3 -m build --wheel source-tree-directory
5) 上传包至PyPi
要注册同1个帐号
测试帐号地址: https://test.pypi.org/account/register/
上传文件,还需要token.
为了安全地上传您的项目,您需要一个PyPiI API令牌。可在https://test.pypi.org/manage/account/#api-tokens 网页创建,将“Scope"设置为“Entie Account”在复制并保存令牌之前,不要关闭页面——否则,将不会再看到该令牌
上传文件的工具是 twine , 安装命令如下
py -m pip install --upgrade twine
在dist子目录下运行, 上传所有文件
py -m twine upload --repository testpypi dist/*
上述命令运行后,会提示你输入username与password, username使用__token__
, 对于password, 使用toke值 ,包括 pypi-
前缀
D:\workplace\python\guangda>python -m twine upload --repository testpypi dist/*
Uploading distributions to https://test.pypi.org/legacy/
Enter your username: peter
Enter your password:
Uploading face_push-0.0.1-py3-none-any.whl
100% ---------------------------------------- 18.6/18.6 kB • 00:00 • ?
Uploading face_push-0.0.1.tar.gz
100% ---------------------------------------- 17.5/17.5 kB • 00:00 • ?
View at:
https://test.pypi.org/project/face-push/0.0.1/
上传完成后,验证
https://test.pypi.org/project/example_package
5. 下载与安装项目
建议,新增1个虚拟环境来验证。 查看安装是否成功
py -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-package
py -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-package-YOUR-USERNAME-HERE
注意,TestPyPI 是测试时使用。
安装完成后, 导入包测试
from example_package import example
example.add_one(2)
熟悉以后,正式的PyPI帐号注册地址:
私有化部署 PyPI server, 可参考 pypiserver官方文档
如果项目非开源,而是私有项目,手工或用脚本将项目wheel 包复制到生产服务器上即可。对于有规模的公司,可以自已搭建 pypiserver 仓库来部署项目。