使用向后兼容 (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
如何使用 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