Skip to main content

以最少的配置在 CI 上构建 Python 轮子。

项目描述

建设车轮

派皮 文件状态 操作状态 特拉维斯状态 申请者状态 CircleCI 状态 Azure 状态 卷云 CI 状态

文档

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
  • 通过auditwheeldelocate捆绑 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 平台上测试轮子arm64arm64一部分。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_*_IMAGE
CIBW_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-学习 github图标 窗口图标 苹果图标 linux图标 机器学习库。一个复杂但干净的配置,使用 cibuildwheel 的许多功能来构建一个带有 Cython 和 C++ 扩展的大型项目。
数字货币 github图标 特拉维斯图标 窗口图标 苹果图标 linux图标 使用 Python 进行科学计算的基础包。
龙卷风 特拉维斯图标 苹果图标 linux图标 Tornado 是一个 Python Web 框架和异步网络库,最初是在 FriendFeed 开发的。
pytorch-fairseq github图标 苹果图标 linux图标 Facebook AI Research 用 Python 编写的序列到序列工具包。
Matplotlib github图标 窗口图标 苹果图标 linux图标 古老的 Matplotlib,一个带有 C++ 部分的 Python 库
神经网络 github图标 窗口图标 苹果图标 linux图标 ncnn 是针对移动平台优化的高性能神经网络推理框架
基维 github图标 窗口图标 苹果图标 linux图标 用 Python 编写的开源 UI 框架,可在 Windows、Linux、macOS、Android 和 iOS 上运行
预言家 github图标 窗口图标 苹果图标 linux图标 用于为具有线性或非线性增长的多个季节性的时间序列数据生成高质量预测的工具。
我的 github图标 苹果图标 linux图标 窗口图标 使用 MyPyC 编译的 MyPy 版本。
书呆子的 github图标 苹果图标 linux图标 窗口图标 使用 Python 类型提示进行数据解析和验证

ℹ️这只是少数,还有更多!查看文档中的工作示例页面。

法律说明

由于使用orcibuildwheel修复轮子,它可能会自动捆绑来自构建机器的动态链接库。delocateauditwheel

它有助于确保库可以在没有 pip 工具链之外的任何依赖项的情况下运行。

这类似于静态链接,因此它可能具有一些许可含义。检查您要提取的任何代码的许可证,以确保这是允许的。

变更日志

v2.10.2

2022 年 9 月 25 日