numpy.distutils 奇怪的架构选择

Odd choice of architecture by numpy.distutils

我正在尝试创建一个包含一些 C 代码和 NumPy 依赖项的 Python 包,我认为使用 numpy.distutils 是实现该目标的最简单方法。到目前为止我有setup.py个文件

from numpy.distutils.core import setup
from numpy.distutils.misc_util import Configuration
from distutils.extension import Extension

ext_modules=[
    Extension("test",
              sources=["test.c"],
              libraries=["gmp"],
    )
]

configuration = Configuration(
    package_name = "test",
    ext_modules = ext_modules,
)

setup(**configuration.todict())

并在同一目录中空 test.c

但是由于某些原因,它在编译过程中添加了笨拙的-arch i386 -arch x86_64标志(系统是Mac OS X),这导致

ld: warning: ignoring file /usr/local/lib/libgmp.dylib, 
file was built for x86_64 which is not the architecture being linked (i386):  
/usr/local/lib/libgmp.dylib

调用 C 函数时出现警告和其他问题。

如何解决该问题?我能以某种方式指定目标架构吗?

UPD。目前我只是做

ARCHFLAGS="-arch x86_64" python setup.py build_ext  --inplace

但我希望它可以在任何平台上运行,而无需预先了解体系结构,以便我可以部署它。

我不相信这些是由 numpy.distutils 添加的,而是 distutils 本身添加的。 distutils 从 Python 的构建方式中获取这些标志,在您的情况下,它是作为具有 32 位和 64 位体系结构的胖二进制文件构建的。此信息是从 $PREFIX/lib/python<version>/config/Makefile 文件中获得的。

对于构建具有二进制依赖项的包的人来说,这是一件很正常的事情。你不知道他们的 Python 是胖还是瘦,你也不知道他们的 libgmp.dylib 是怎么长出来的。通过大量的努力,您可以在 setup.py 中编写一些代码来定位 libgmp.dylib,询问它的体系结构,然后将 distutils 配置为仅使用正确的标志(并且仍然正确在不需要时操作,优雅地失败,等等)。但是,通过简单地记录可能会出现的情况和 ARCHFLAGS= 解决方案,您的开发工作可能会获得更大的回报。