使用向后兼容 (MacOS10.9+) 的 MacOS 10.15 (Catalina) 创建 Python C 扩展

Create Python C extension using MacOS 10.15 (Catalina) that is backwards compatible (MacOS10.9+)

如何使用 MacOS 10.15 创建向后兼容 (MacOS 10.9+) 的 Python C 扩展轮?

这是我目前拥有的:

export MACOSX_DEPLOYMENT_TARGET=10.9
python -m pip wheel . -w wheels --no-deps
python -m pip install delocate
for whl in wheels/*.whl; do
    delocate-wheel -w wheels_fixed -v "$whl"
done

不幸的是,pip wheel生成了一个文件myapp-0.0.1-cp37-cp37m-macosx_10_15_x86_64.whl,与Linux上的auditwheel不同,delocate-wheel没有修改轮子的名称。因此,如果我使用 twine 将其上传到 PyPI,则只有使用 MacOS 10.15 的用户才能使用 pip 安装它。我想我可以手动将它重命名为 myapp-0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl,但这对我来说听起来不对。

对于构建,我只使用 GitHub Actions MacOS 虚拟机。

谢谢。

PS: 构建使用的编译器是GCC9

我找到了问题的解决方案,我会 post 在这里给出答案,以防其他人遇到同样的问题。

为了解决这个问题,我还必须在使用 pyenv 安装 python 之前设置 export MACOSX_DEPLOYMENT_TARGET=10.9。现在 pip wheel 使用标签 macosx_10_9_x86_64 创建我的轮子。

谢谢。

PS:当通过 pyenv 安装 python 时,python 是从源代码编译的,并且它以某种方式考虑了标志 MACOSX_DEPLOYMENT_TARGET

根据this answer,构建python解释器所使用的MACOSX_DEPLOYMENT_TARGET的值决定了可用于wheel创建的默认值和最小值。

如您所见,actions/setup-python 中的 python 使用相对较新的版本(当前为 10.14),因此与旧版本不兼容。 actions/setup-python#26.

中有一个未解决的问题

作为另一个解决方法,我建议通过 conda 设置 python。这会产生一些额外的开销(~2 分钟),但仍然比手动构建 python 好得多。例如:

      - uses: goanpeca/setup-miniconda@v1
        with:
          architecture: x64
          python-version: '3.8'
          # must be explicitly specified if architecture is not x64:
          miniconda-version: latest

      - run: |
          conda create -qyf py35 python=3.5 wheel -c anaconda
          conda activate py35
          python setup.py sdist bdist_wheel
        shell: bash -l {0}

      - run: |
          conda create -qyf py36 python=3.6 wheel -c anaconda
          conda activate py36
          python setup.py sdist bdist_wheel
        shell: bash -l {0}

      ...

这将导致以下部署目标:

  • py2.7: 10.7
  • py3.5: 10.6
  • py3.6: 10.9
  • py3.7: 10.9
  • py3.8: 10.9