6

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.

nmDavid 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

(もちろん、チェーンの残りの部分を同じオプションpythonpy26-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 に答える