使用向后兼容的 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以上第三方软件安装问题
教程篇macOS 10.15 MAC应用无法打开或文件已损坏处理方法