i386/x86_64 ユニバーサル バイナリとしてコンパイルし、64 ビット 10.6.2 MacPro1,1 で実行すると、32 ビット モードで scipy を機能させることができません。
私のpythonセットアップ
この回答の助けを借りて、arch
コマンドを使用してアーキテクチャを選択することを意図して、Python 2.6.4 の 32/64 ビット Intel ユニバーサル バイナリを作成しました。(リポを使用して、必要ないくつかのライブラリのユニバーサル バイナリを作成することができました。) すべてが機能します。次に、 hyperjeff の記事の指示に従って scipy をインストールしましたが、より最新の numpy (1.4.0) のみを使用し、scipy のインストール中に numpy を一時的に脇に移動することについて少しスキップしました。
現在、私が知る限り、scipy 以外のすべてが機能しているようで、実際に と を使用して 32 ビット モードと 64 ビット モードを選択できarch -i386 python
ます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. ビルド 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)
ただし、その不在についてはまだ説明できません。