Двоичный файл Mac 10.6 Universal scipy: cephes/specfun “_aswfa _” символ, не найденный

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

Моя установка Python

С помощью этого ответа я создал Intel на 32/64 бита универсальный двоичный файл Python 2.6.4 с намерением использовать arch управляйте для выбора между архитектурой. (Мне удалось сделать некоторые универсальные двоичные файлы нескольких библиотек, я хотел использовать lipo.), Что все работы. Я затем установил scipy согласно инструкциям относительно статьи hyperjeff, только с более актуальным 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 "", line 1, in 
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/interpolate/__init__.py", line 7, in 
    from interpolate import *
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/interpolate/interpolate.py", line 13, in 
    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 
    from basic import *
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scipy/special/basic.py", line 8, in 
    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

Гул Ho. Я застреваю. Вещи я могу попробовать, но не выяснил, как все же включают компиляцию specfun.so сам вручную, так или иначе.

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

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

(редактирование) Больше деталей для рассматривания вопросов:

Я использую gfortran (GNU Фортран от 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, как предложил David Cournapeau:

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

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

6
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

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

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

1
ответ дан 17 December 2019 в 07:04
поделиться

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

3
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: