【问题标题】:Cython compilation using wrong Mac OS libraries使用错误的 Mac OS 库进行 Cython 编译
【发布时间】:2019-03-14 16:34:07
【问题描述】:

我正在开发一个使用 Cython 构建的项目,并且在某些特定系统上遇到了一些有趣的安装问题。问题归结为 Mac OS 版本不匹配,或者我对 Mac OS 版本的理解不匹配。

在我的系统上安装 Cython 库时,编译日志显示我使用的是 Mac OS 版本 10.12,即使我的系统告诉我我使用的是 10.13。编译日志摘录如下:

creating build/temp.macosx-10.12-x86_64-3.6

这对我来说不是问题,但另一个用户在 10.13 上的系统发布时遇到了问题,但他们的编译显示为 10.7(这需要一些其他解决方法)。

是否可以更新此构建系统?或者我对 Mac OS 有什么误解?

有没有办法从 Python 脚本中判断将使用哪些构建库?

谢谢!

编辑:

平台信息输出:

>>> python -c "import platform; print(platform.mac_ver())"
('10.13.6', ('', '', ''), 'x86_64')

>>> python -c "import distutils.util; print(distutils.util.get_platform())"
macosx-10.12-x86_64

【问题讨论】:

  • 版本不匹配是奇数;当你从终端运行python -c "import platform; print(platform.mac_ver())" 时,你会得到什么?
  • 所以 Python 可以正确识别平台版本。您看到的是distutils.util.get_platform 的输出 - 通过python -c "import distutils.util; print(distutils.util.get_platform())" 重现该输出(另外,请确保使用正确的可执行文件,在您的情况下应该是python3.6)。在 MacOS 上,它不会显示您正在运行的平台的版本,而是显示您的 Python 发行版所基于的平台的版本。这可确保distutils 使用与您将使用已编译扩展对象的 Python 发行版相同的 ABI 来构建 C 扩展。
  • 一般来说,在 MacOS 上构建一个“通用”的轮子是一个很棘手的话题;如果你想在你的机器上构建一个轮子,在其他 MacOS 机器上安装和运行各种 Python 发行版,经验法则是获得一个 Python 发行版,其中distutils.util.get_platform 输出macosx-10.6-intel。这个 ABI 似乎是最兼容的一个;但是,从您的输出来看,您似乎已经安装了 brewed Python 3;根据我的经验,它不适合制造万向轮。
  • 如果您希望两个版本匹配,您可以从源代码构建您自己的 Python 发行版,但请注意,使用该发行版构建的 C 扩展将与旧 ABI 不兼容。
  • 仅当您正在安装的发行版是使用较新的 ABI 重建时,重新安装 Python 会导致 distutils 平台版本的冲突;否则,这个数字不会改变。

标签: python macos cython setuptools


【解决方案1】:

我的背景

Big Sur (macOS 10.16)、python3.6 和 cython 也出现了类似的问题。 检查 cython (.pyxbld) 的构建目录,我发现 temp.macOSX-10.7 构建和文件,这显然与 10.16 不兼容。

一些解释为什么会这样

在底层,cython 使用 distutils 来确定平台版本(而不是其他东西)。 https://github.com/python/cpython/blob/master/Lib/distutils/util.py 那么 distutils 怎么了?

经过大量搜索(包括这篇文章),我发现了一篇非常有趣且很好的文章(尽管来自 2014 年),它解释了这种现象。 https://lepture.com/en/2014/python-on-a-hard-wheel

基本上,它与 distutils 的构建方式以及它具有硬编码的平台标签有关......(这也适用于轮文件)。

解决方案(有点)

看来解决办法是:

  1. 重新安装 python(然后是所有包)
  2. 确保python -c "import distutils.util; print(distutils.util.get_platform())" macosx-10.12-x86_64 输出正确的版本。

编辑

显然在 Big Sur 上使用 Anaconda 时,此解决方案尚不可用...(如果 Anaconda 上的解决方案有效,正在进行的工作将更新)[2020 年 11 月 20 日星期五]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多