numpy.distutils对架构的奇怪选择

时间:2017-03-08 10:17:19

标签: python 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

但我希望在没有架构先验知识的情况下在任何平台上工作,以便我可以部署它。

1 个答案:

答案 0 :(得分:1)

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

对于构建具有二进制依赖关系的包必须处理的人来说,这是非常正常的事情。你不知道他们的Python是胖还是瘦,你也不知道他们是如何构建他们的libgmp.dylib的。通过大量工作,您可以在setup.py中编写一些代码来查找libgmp.dylib,查询其架构,然后将distutils配置为仅使用正确的标志(并且仍然正确)在没有必要的情况下进行操作,优雅地失败,等等。但是,通过简单地记录这可能会出现以及ARCHFLAGS=解决方案,您可能会为您的开发工作获得更多的收获。