以最少的配置在 CI 上构建 Python 轮子。
项目描述
建设车轮
Python 轮子很棒。在多个版本的 Python上跨Mac、Linux、Windows构建它们不是。
cibuildwheel是来帮忙的。cibuildwheel在你的 CI 服务器上运行——目前它支持 GitHub Actions、Azure Pipelines、Travis CI、AppVeyor、CircleCI 和 GitLab CI——它在你的所有平台上构建和测试你的轮子。
它有什么作用?
| macOS 英特尔 | macOS 苹果硅 | 视窗 64 位 | 视窗 32 位 | 视窗 Arm64 | manylinux musllinux x86_64 |
manylinux musllinux i686 |
manylinux musllinux aarch64 |
manylinux musllinux ppc64le |
manylinux musllinux s390x |
|
|---|---|---|---|---|---|---|---|---|---|---|
| CPython 3.6 | ✅ | 不适用 | ✅ | ✅ | 不适用 | ✅ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.7 | ✅ | 不适用 | ✅ | ✅ | 不适用 | ✅ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | 不适用 | ✅ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅³ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ |
| PyPy 3.7 v7.3 | ✅ | 不适用 | ✅ | 不适用 | 不适用 | ✅¹ | ✅¹ | ✅¹ | 不适用 | 不适用 |
| PyPy 3.8 v7.3 | ✅ | 不适用 | ✅ | 不适用 | 不适用 | ✅¹ | ✅¹ | ✅¹ | 不适用 | 不适用 |
| PyPy 3.9 v7.3 | ✅ | 不适用 | ✅ | 不适用 | 不适用 | ✅¹ | ✅¹ | ✅¹ | 不适用 | 不适用 |
¹ PyPy 仅支持 manylinux 轮子。
² Windows arm64 支持是实验性的。
³ Alpine 3.14 和非常简短的 3.15 的默认 python3无法加载musllinux 轮子。这已得到修复;如果在修复之前使用 Alpine,请升级 python 包。
- 为 CPython 和 PyPy 构建 manylinux、musllinux、macOS 10.9+ 和 Windows 轮子
- 适用于 GitHub Actions、Azure Pipelines、Travis CI、AppVeyor、CircleCI、GitLab CI 和 Cirrus CI
- 通过auditwheel和delocate捆绑 Linux 和 macOS 上的共享库依赖项
- 针对您的库的轮式安装版本运行您的库的测试
如果您需要构建不受支持的 Python 版本,例如 Python 2,请参阅cibuildwheel 1 文档。
用法
cibuildwheel在 CI 服务中运行。支持的平台取决于您使用的服务:
| Linux | 苹果系统 | 视窗 | Linux ARM | macOS ARM | |
|---|---|---|---|---|---|
| GitHub 操作 | ✅ | ✅ | ✅ | ✅¹ | ✅² |
| Azure 管道 | ✅ | ✅ | ✅ | ✅² | |
| 特拉维斯 CI | ✅ | ✅ | ✅ | ||
| 应用程序 | ✅ | ✅ | ✅ | ✅² | |
| 圈子CI | ✅ | ✅ | ✅² | ||
| Gitlab CI | ✅ | ||||
| 卷云CI | ✅ | ✅³ | ✅ | ✅ | ✅ |
¹需要仿真,单独分发。其他服务也可能通过仿真或第三方构建主机支持 Linux ARM,但这些并未在我们的 CI 中进行测试。
²使用交叉编译。无法在此 CI 平台上测试轮子arm64的arm64一部分。universal2
³使用交叉编译。多亏了 Rosetta 2 仿真,可以在这个 CI 平台上测试轮子的x86_64两个部分。universal2
示例设置
要在 GitHub Actions 上构建 manylinux、musllinux、macOS 和 Windows 轮子,您可以使用以下命令.github/workflows/wheels.yml:
name: Build
on: [push, pull_request]
jobs:
build_wheels:
name: Build wheels on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-20.04, windows-2019, macOS-11]
steps:
- uses: actions/checkout@v3
# Used to host cibuildwheel
- uses: actions/setup-python@v3
- name: Install cibuildwheel
run: python -m pip install cibuildwheel==2.10.2
- name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse
# to supply options, put them in 'env', like:
# env:
# CIBW_SOME_OPTION: value
- uses: actions/upload-artifact@v3
with:
path: ./wheelhouse/*.whl
有关更多信息,包括 PyPI 部署以及其他 CI 服务或专用 GitHub 操作的使用,请查看文档和示例。
这个怎么运作
下图总结了 cibuildwheel 在每个平台上执行的步骤。
在文档中探索此图的交互式版本。
选项
| 选项 | 描述 | |
|---|---|---|
| 构建选择 | CIBW_PLATFORM |
覆盖自动检测的目标平台 |
CIBW_BUILD CIBW_SKIP |
选择要构建的 Python 版本 | |
CIBW_ARCHS |
默认情况下更改在您的机器上构建的架构。 | |
CIBW_PROJECT_REQUIRES_PYTHON |
手动设置项目的 Python 兼容性 | |
CIBW_PRERELEASE_PYTHONS |
如果可用,启用使用 Python 的预发布版本进行构建 | |
| 构建自定义 | CIBW_BUILD_FRONTEND |
设置用于构建的工具,“pip”(目前默认)或“build” |
CIBW_ENVIRONMENT |
设置构建过程中需要的环境变量 | |
CIBW_ENVIRONMENT_PASS_LINUX |
在主机上设置环境变量以在构建期间传递给容器。 | |
CIBW_BEFORE_ALL |
在构建任何轮子之前,在构建系统上执行 shell 命令。 | |
CIBW_BEFORE_BUILD |
执行一个 shell 命令准备每个轮子的构建 | |
CIBW_REPAIR_WHEEL_COMMAND |
执行一个 shell 命令来修复每个构建的车轮 | |
CIBW_MANYLINUX_*_IMAGECIBW_MUSLLINUX_*_IMAGE |
指定替代 manylinux / musllinux Docker 镜像 | |
CIBW_CONTAINER_ENGINE |
指定构建 Linux 轮子时要使用的容器引擎 | |
CIBW_DEPENDENCY_VERSIONS |
指定 cibuildwheel 如何控制它使用的工具的版本 | |
| 测试 | CIBW_TEST_COMMAND |
执行一个 shell 命令来测试每个构建的轮子 |
CIBW_BEFORE_TEST |
在测试每个轮子之前执行一个 shell 命令 | |
CIBW_TEST_REQUIRES |
在运行测试之前安装 Python 依赖项 | |
CIBW_TEST_EXTRAS |
使用 extras_require 安装你的轮子进行测试 | |
CIBW_TEST_SKIP |
跳过某些构建的运行测试 | |
| 其他 | CIBW_BUILD_VERBOSITY |
增加/减少点轮输出 |
这些选项也可以在 pyproject.toml 文件中指定;见配置。
工作示例
以下是一些使用 cibuildwheel 的存储库。
| 姓名 | CI | 操作系统 | 笔记 |
|---|---|---|---|
| scikit-学习 | 机器学习库。一个复杂但干净的配置,使用 cibuildwheel 的许多功能来构建一个带有 Cython 和 C++ 扩展的大型项目。 | ||
| 数字货币 | 使用 Python 进行科学计算的基础包。 | ||
| 龙卷风 | Tornado 是一个 Python Web 框架和异步网络库,最初是在 FriendFeed 开发的。 | ||
| pytorch-fairseq | Facebook AI Research 用 Python 编写的序列到序列工具包。 | ||
| Matplotlib | 古老的 Matplotlib,一个带有 C++ 部分的 Python 库 | ||
| 神经网络 | ncnn 是针对移动平台优化的高性能神经网络推理框架 | ||
| 基维 | 用 Python 编写的开源 UI 框架,可在 Windows、Linux、macOS、Android 和 iOS 上运行 | ||
| 预言家 | 用于为具有线性或非线性增长的多个季节性的时间序列数据生成高质量预测的工具。 | ||
| 我的 | 使用 MyPyC 编译的 MyPy 版本。 | ||
| 书呆子的 | 使用 Python 类型提示进行数据解析和验证 |
ℹ️这只是少数,还有更多!查看文档中的工作示例页面。
法律说明
由于使用orcibuildwheel修复轮子,它可能会自动捆绑来自构建机器的动态链接库。delocateauditwheel
它有助于确保库可以在没有 pip 工具链之外的任何依赖项的情况下运行。
这类似于静态链接,因此它可能具有一些许可含义。检查您要提取的任何代码的许可证,以确保这是允许的。
变更日志
v2.10.2
2022 年 9 月 25 日