2017-03-08 53 views
4

我想創建一個Python包與一些C代碼和NumPy依賴關係,我認爲使用numpy.distutils將是最簡單的方法來實現。到目前爲止,我有setup.py文件通過numpy.distutils的奇怪選擇架構

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

我不相信這些都是numpy.distutils,但distutils本身。 distutils從Python的構建方式獲取這些標誌,在你的情況下,它是用32位和64位體系結構構建的胖二進制文件。該信息從$PREFIX/lib/python<version>/config/Makefile文件獲得。

這對於構建具有二進制相關性的軟件包必須處理的人來說是非常正常的事情。你不知道他們的Python是胖還是瘦,你也不知道他們是如何構建他們的libgmp.dylib。經過很多努力,你可以在你的setup.py中編寫一些代碼,找到libgmp.dylib,詢問它的架構,然後配置distutils只使用正確的標誌(並且在沒有必要時仍然正確操作,優雅地失敗等等)。但是,通過簡單記錄可能會出現的問題以及解決方案,您可能會對開發工作產生更大的影響。

+0

那麼......它似乎沒有其他選擇的確如此。 –