Mac 10.6 Universal Binary scipy: cephes / specfun “_aswfa_” no se encuentra el símbolo

No puedo lograr que Scipy funcione en modo de 32 bits cuando se comstack como un binario universal i386 / x86_64, y se ejecuta en mi MacPro 1.0 de 64 bits 10.6.2.

Mi configuración de python

Con la ayuda de esta respuesta , construí un binario Intel universal de 32/64 bits de python 2.6.4 con la intención de usar el comando arch para seleccionar entre las architectures. (Me las arreglé para hacer algunos binarios universales de algunas bibliotecas que quería usar lipo). Eso funciona. Luego instalé scipy de acuerdo con las instrucciones en el artículo de hyperjeff , solo con un número más actualizado (1.4.0) y saltándome la brecha acerca de mover un número a un lado brevemente durante la instalación de scipy.

Ahora, todo excepto Scipy parece estar funcionando tan bien como puedo decir, y de hecho puedo seleccionar entre el modo de 32 y 64 bits usando arch -i386 python y arch -x86_64 python .

El error

Scipy se queja en modo de 32 bits:

 $ 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 

Intentar localizar el problema

Parece que scipy.interpolate importa algo llamado _cephes , que busca un símbolo llamado _aswfa_ pero no puede encontrarlo en el modo de 32 bits. Al buscar en la fuente de scipy, encuentro una subrutina ASWFA en specfun.f. El único archivo de producto scipy con un nombre similar es specfun.so, pero tanto eso como _cephes.so parecen ser binarios universales:

 $ 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 hum. Estoy atascado. Las cosas que puedo probar pero no he descubierto cómo aún incluyen la comstackción de specfun.so de forma manual.

Me imagino que Scipy no está roto para todas las máquinas de 32 bits, así que creo que hay algún problema con la forma en que lo instalé, pero no puedo averiguar qué.

Realmente no espero una respuesta completa dada mi configuración bastante única (?), Pero si alguien tiene alguna pista que pueda orientarme en la dirección correcta, sería muy apreciada.

(editar) Más detalles para abordar preguntas:

Estoy usando gfortran (GNU Fortran de GCC 4.2.1 Apple Inc. build 5646).

Python 2.6.4 se instaló más o menos así:

 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 se instaló más o menos como se describe aquí , pero se reduce a un simple sudo python setup.py install .

De hecho, parecería que el símbolo no está definido en la architecture i386 si miras la biblioteca _cephes con nm , como sugiere 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) 

Sin embargo, todavía no puedo explicar su ausencia.

¿Has intentado usar scipy comstackdo usando macports?

 sudo port install scipy +universal 

(por supuesto, debe tener el rest de la cadena, python , py26-numpy comstackdo con la misma opción)

Yo obtengo:

 $ 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 

luego puede utilizar la configuración y el conocimiento que los mantenedores de macports utilizaron para hacer su propia comstackción.

¿Cómo instalaste scipy, para qué versión de Python y con qué comstackdor de Fortran?

También es posible que desee verificar que el símbolo faltante esté en ambos arcos (no recuerdo de manera remota dónde está la función, pero debería poder encontrar ti por sí mismo con bastante facilidad usando una combinación de nm / otool).