当编译为 i386/x86_64 通用二进制文件并在我的 64 位 10.6.2 MacPro1,1 上执行时,我无法让 scipy 在 32 位模式下运行。
我的蟒蛇设置
在这个答案的帮助下,我构建了 python 2.6.4 的 32/64 位英特尔通用二进制文件,目的是使用arch
命令在架构之间进行选择。(我设法使用 lipo 制作了一些我想要的库的通用二进制文件。)这一切都有效。然后,我根据hyperjeff 的文章中的说明安装了 scipy ,仅使用了更新的 numpy (1.4.0),并在安装 scipy 期间略过了将 numpy 移到一边的内容。
现在,据我所知,除了 scipy 之外的所有东西似乎都在工作,而且我确实可以使用arch -i386 python
and在 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
尝试追踪问题
看起来 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
哼哼。我被困住了。我可能会尝试但还没有弄清楚如何包括手动编译 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
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)
但是,我还不能解释它的缺席。