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=
解决方案,您的开发工作可能会获得更大的回报。
我正在尝试创建一个包含一些 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=
解决方案,您的开发工作可能会获得更大的回报。