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

Posted

技术标签:

【中文标题】使用向后兼容的 MacOS 10.15 (Catalina) 创建 Python C 扩展 (MacOS10.9+)【英文标题】:Create Python C extension using MacOS 10.15 (Catalina) that is backwards compatible (MacOS10.9+) 【发布时间】:2020-06-11 10:49:10 【问题描述】:

如何使用 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

【问题讨论】:

【参考方案1】:

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

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

谢谢。

PS:当通过pyenv安装python时,python是从源代码编译的,不知何故它考虑到了标志MACOSX_DEPLOYMENT_TARGET

【讨论】:

【参考方案2】:

根据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

【讨论】:

以上是关于使用向后兼容的 MacOS 10.15 (Catalina) 创建 Python C 扩展 (MacOS10.9+)的主要内容,如果未能解决你的问题,请参考以下文章

macOS Catalina10.15以上第三方软件安装问题

教你如何解锁macOS10.15的系统分区

教程篇macOS 10.15 MAC应用无法打开或文件已损坏处理方法

MacOS 10.15 Catalina 的颤振问题

将 JonesForth 移植到 macOS v10.15 (Catalina)

Xcode 13.2 beta 发布,Swift 这个更新太赞了