Mac 10.6 Universal Binary scipy: символ cephes/specfun _aswfa_ не найден

Я не могу заставить scipy работать в 32-битном режиме, когда он скомпилирован как универсальный двоичный файл i386/x86_64 и выполняется на моем 64-битном 10.6.2 MacPro1,1.

Моя установка питона

С помощью этот ответ, я создал 32/64-битный универсальный двоичный файл Intel для Python 2.6.4 с намерением использовать команду arch для выбора между архитектурами. (Мне удалось сделать несколько универсальных двоичных файлов из нескольких библиотек, которые я хотел, используя lipo.) Все это работает. Затем я установил scipy в соответствии с инструкциями из статьи Hyperjeff, только с более современными настройками. date numpy (1.4.0) и ненадолго пропустить информацию о перемещении numpy в сторону во время установки scipy.

Насколько я могу судить, теперь все, кроме 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 вручную, каким-то образом.

Я бы предположил, что scipy не сломан для всех 32-битных машин, поэтому я предполагаю, что что-то не так с тем, как я его установил, но я не могу понять, что.

Я действительно не ожидаю полного ответа, учитывая мою довольно уникальную (?) установку, но если у кого-то есть какие-либо подсказки, которые могут указать мне правильное направление, они будут очень признательны.

(изменить) Дополнительные сведения для ответов на вопросы:

Я использую gfortran (GNU Fortran из GCC 4.2.1 Apple Inc., сборка 5646).

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.

Действительно может показаться, что этот символ не определен в архитектуре i386, если вы посмотрите на библиотеку _cephes с nm, как предложил Дэвид Курнапо:

$ 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)

однако я пока не могу объяснить его отсутствие.


person Markus    schedule 28.01.2010    source источник
comment
Вероятно, scipy еще не поддерживает сборку в качестве универсального двоичного файла - в процессе сборки происходит так много сложных вещей, что это не так просто (numpy работал только недавно). Вы можете попробовать подать заявку на scipy trac (а также попробовать scipy svn - 0.7.1 уже выпущен некоторое время назад, поэтому svn может содержать исправление). Кроме того, где вы взяли свой компилятор fortran? Рекомендуются файлы отсюда: r.research.att.com/tools — другие обычно не подходят есть специальные вещи Apple, такие как поддержка арки   -  person robince    schedule 13.02.2010


Ответы (2)


Вы пытались использовать scipy, скомпилированный с использованием macports?

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 для создания собственной компиляции.

person meduz    schedule 06.02.2010
comment
Устанавливает ли macports python с фиксированной версией pythonw.c? Насколько я знаю, есть ошибка, из-за которой arch -i386 также выполняет 64-битную версию. Если он работает правильно, sys.maxint должен отличаться между ними: 2147483647 для i386 и 9223372036854775807 для x86_64, но неисправленный python будет печатать большее число для обоих флагов. Не могли бы вы проверить, как ваш sys.maxint ведет себя с различными арками? - person Markus; 07.02.2010
comment
Вы правы: $ arch -i386 /opt/local/bin/python дает мне >>> import sys; print sys.maxint это 9223372036854775807 ничего не смог найти об этом в macports' trac, однако... - person meduz; 11.02.2010

Как вы установили scipy, для какой версии python и с каким компилятором fortran?

Вы также можете проверить, что отсутствующий символ действительно находится в обеих арках (я не помню навскидку, где находится функция, но вы сможете легко найти ее самостоятельно, используя комбинацию nm/otool).

person David Cournapeau    schedule 02.02.2010
comment
Обновил вопрос с этими деталями. Я предполагаю, что нужно попытаться скомпилировать _cephes вручную. - person Markus; 03.02.2010