cibuildwheel

cibuildwheel vereinfacht die Erstellung von Python Wheels für die verschiedenen Plattformen und Python-Versionen durch Continuous Integration (CI) Workflows. Genauer gesagt baut es Manylinux-, macOS 10.9+- und Windows-Wheels für CPython und PyPy mit GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, oder GitLab CI.

Darüber hinaus bündelt es gemeinsam genutzte Bibliotheksabhängigkeiten unter Linux und macOS durch auditwheel und delocate.

Schließlich können die Tests auch gegen die Wheels laufen.

Siehe auch

GitHub Actions

Um Linux-, macOS- und Windows-Wheels erstellen zu können, erstellt eine .github/workflows/build_wheels.yml-Datei in eurem GitHub Repo:

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-10.15]

    steps:
      - uses: actions/checkout@v2

      - name: Build wheels
        uses: pypa/cibuildwheel@v1.11.0
        # to supply options, put them in 'env', like:
        # env:
        #   CIBW_SOME_OPTION: value

      - uses: actions/upload-artifact@v2
        with:
          path: ./wheelhouse/*.whl

Dadurch wird der CI-Workflow mit den folgenden Standardeinstellungen ausgeführt:

  • package-dir: .

  • output-dir: wheelhouse

Ihr könnt die Datei erweitern um die Wheels automatisch auf den Python Package Index (PyPI) hochzuladen mit:

upload_pypi:
  needs: [build_wheels, build_sdist]
  runs-on: ubuntu-latest
  # upload to PyPI on every tag starting with 'v'
  if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v')
  # alternatively, to publish when a GitHub Release is created, use the following rule:
  # if: github.event_name == 'release' && github.event.action == 'published'
  steps:
    - uses: actions/download-artifact@v2
      with:
        name: artifact
        path: dist

    - uses: pypa/gh-action-pypi-publish@master
      with:
        user: __token__
        password: ${{ secrets.pypi_password }}
        # To test: repository_url: https://test.pypi.org/legacy/

Gitlab CI

Um Linux-Wheels mit Gitlab CI zu bauen, erstellt eine .gitlab-ci.yml-Datei in eurem Repository:

linux:
  image: python:3.8
  # make a docker daemon available for cibuildwheel to use
  services:
    - name: docker:dind
      entrypoint: ["env", "-u", "DOCKER_HOST"]
      command: ["dockerd-entrypoint.sh"]
  variables:
    DOCKER_HOST: tcp://docker:2375/
    DOCKER_DRIVER: overlay2
    # See https://github.com/docker-library/docker/pull/166
    DOCKER_TLS_CERTDIR: ""
  script:
    - curl -sSL https://get.docker.com/ | sh
    - python -m pip install cibuildwheel==1.11.0
    - cibuildwheel --output-dir wheelhouse
  artifacts:
    paths:
      - wheelhouse/

Beispiele