Mac 10.6 Universal Binary scipy:找不到cephes/specfun"_aswfa_"符号

Mar*_*kus 6 python architecture scipy osx-snow-leopard universal-binary

当作为I386/x86_64的通用二进制编译,而在我的64位10.6.2 MacPro1,1执行我不能得到SciPy的32位模式下运行.

我的python设置

这个答案的帮助下,我构建了一个32/64位的python 2.6.4的intel通用二进制文件,目的是使用arch命令在架构之间进行选择.(我设法使用lipo制作了一些我想要的库的通用二进制文件.)一切正常.然后我根据hyperjeff的文章中的说明安装了scipy ,只是使用了更新的numpy(1.4.0)并且在安装scipy时跳过了关于简单地移动numpy的一点.

现在,除了scipy之外的所有东西似乎都可以正常工作,我确实可以使用arch -i386 python和选择32位和64位模式arch -x86_64 python.

错误

Scipy以32位模式抱怨:

$ arch -x86_64 python -c "import scipy.interpolate; print 'success'"
success
$ arch -i386 python -c "import scipy.interpolate; print 'success'"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/interpolate/__init__.py", line 7, in <module>
    from interpolate import *
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/interpolate/interpolate.py", line 13, in <module>
    import scipy.special as spec
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/__init__.py", line 8, in <module>
    from basic import *
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/basic.py", line 8, in <module>
    from _cephes import *
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so, 2): Symbol not found: _aswfa_
  Referenced from: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so
  Expected in: flat namespace
 in /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so
Run Code Online (Sandbox Code Playgroud)

尝试追踪问题

它看起来像scipy.interpolate导入一些被调用的东西_cephes,它会查找一个被调用的符号,_aswfa_但无法在32位模式下找到它.浏览scipy的源代码,我ASWFA在specfun.f中找到了一个子程序.唯一具有相似名称的scipy产品文件是specfun.so,但是它和_cephes.so似乎都是通用二进制文件:

$ cd /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/
$ file _cephes.so specfun.so 
_cephes.so: Mach-O universal binary with 2 architectures
_cephes.so (for architecture i386): Mach-O bundle i386
_cephes.so (for architecture x86_64): Mach-O 64-bit bundle x86_64
specfun.so: Mach-O universal binary with 2 architectures
specfun.so (for architecture i386): Mach-O bundle i386
specfun.so (for architecture x86_64): Mach-O 64-bit bundle x86_64
Run Code Online (Sandbox Code Playgroud)

哼哼.我被卡住了.我可能会尝试,但还没有想出如何包括编译specfun.so自己手动,不知何故.

我想,对于所有32位机器来说scipy并没有被破坏,所以我想我安装它的方式有问题,但我无法弄清楚是什么.

考虑到我相当独特的(?)设置,我真的不期待一个完整的答案,但如果有人有任何可能指向我正确方向的线索,他们将非常感激.

(编辑)解决问题的更多细节:

我正在使用gfortran(来自GCC 4.2.1 Apple Inc. build 5646的GNU Fortran).

Python 2.6.4的安装或多或少是这样的:

cd /tmp
curl -O http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tar.bz2
tar xf Python-2.6.4.tar.bz2
cd Python-2.6.4
# Now replace buggy pythonw.c file with one that supports the "arch" command:
curl http://bugs.python.org/file14949/pythonw.c | sed s/2.7/2.6/ > Mac/Tools/pythonw.c    
./configure --enable-framework=/Library/Frameworks --enable-universalsdk=/ --with-universal-archs=intel
make -j4
sudo make frameworkinstall
Run Code Online (Sandbox Code Playgroud)

Scipy 0.7.1的安装方式与此处描述的相同,但归结为简单sudo python setup.py install.

如果nm按照David Cournapeau的建议查看_cephes库,那么i386架构中的符号确实是未定义的:

$ nm -arch x86_64 /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so | grep _aswfa_
00000000000d4950 T _aswfa_
000000000011e4b0 d _oblate_aswfa_data
000000000011e510 d _oblate_aswfa_nocv_data
(snip)
$ nm -arch i386 /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/_cephes.so | grep _aswfa_
         U _aswfa_
0002e96c d _oblate_aswfa_data
0002e99c d _oblate_aswfa_nocv_data
(snip)
Run Code Online (Sandbox Code Playgroud)

但是,我还不能解释它的缺席.

Dav*_*eau 1

你是如何安装 scipy 的,哪个 python 版本,以及哪个 fortran 编译器?

您可能还想检查丢失的符号确实在两个拱形中(我不记得函数在哪里,但您应该能够使用 nm/otool 的组合轻松地自己找到 ti )。