6

当编译为 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 pythonand在 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)

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

4

2 回答 2

3

您是否尝试过使用 macports 编译的 scipy?

sudo port install scipy +universal

(当然,您必须使用相同的选项编译链python的其余部分)py26-numpy

我得到:

$ arch -x86_64 /opt/local/bin/python -c "import scipy.interpolate; print 'success'"
success

$ arch -i386 /opt/local/bin/python -c "import scipy.interpolate; print 'success'"
success

然后,您可以使用 macports 维护者用来进行自己编译的设置和知识。

于 2010-02-06T14:22:44.873 回答
1

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

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

于 2010-02-02T07:43:23.097 回答