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

2024-04-26 09:59:43 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用MacOS 10.15为MacOS创建向后兼容(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


Tags: piptargetdeploymentexportmacoswheelsmyappx86
2条回答

我找到了问题的解决方案,我会把答案贴在这里,以防其他人也有同样的问题

为了解决这个问题,我还必须在使用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值决定了可用于创建控制盘的默认值和最小值

正如您所注意到的,来自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

相关问题 更多 >