Problemas con PyDev y bibliotecas externas en OS X

He instalado exitosamente la última versión de PyDev en mi Eclipse (3.5.1) bajo OS X 10.6.3, con python 2.6.1
Tengo problemas para hacer que las bibliotecas que he instalado funcionen.
Por ejemplo, estoy tratando de usar la biblioteca cx_Oracle, que funciona perfectamente si se llama desde el intérprete de Python desde scripts simples hechos con algún editor de texto.
Pero no puedo hacer que funcione dentro de Eclipse: tengo este pequeño código:

import cx_Oracle conn = cx_Oracle.connect(CONN_STRING) sql = "select field from mytable" cursor = conn.cursor() cursor.execute(sql) for row in cursor: field = row[0] print field 

Si lo ejecuto desde Eclipse, obtengo el siguiente error:

 import cx_Oracle File "build/bdist.macosx-10.6-universal/egg/cx_Oracle.py", line 7, in  File "build/bdist.macosx-10.6-universal/egg/cx_Oracle.py", line 6, in __bootstrap__ ImportError: dlopen(/Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so, 2): Library not loaded: /b/227/rdbms/lib/libclntsh.dylib.10.1 Referenced from: /Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so Reason: no suitable image found. Did find: /Users/dave/lib/libclntsh.dylib.10.1: mach-o, but wrong architecture 

El mismo fragmento funciona perfectamente desde la shell de python

He configurado el intérprete en Eclipse en las preferencias -> PyDev -> Intérprete – Python, usando la opción de configuración automática y seleccionando todas las librerías encontradas.

¿Qué estoy haciendo mal aquí?

Edición: lanzamiento

 file /Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so 

desde la línea de comandos dice esto:

 /Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so: Mach-O universal binary with 3 architectures /Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so (for architecture i386): Mach-O bundle i386 /Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so (for architecture ppc7400): Mach-O bundle ppc /Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so (for architecture x86_64): Mach-O 64-bit bundle x86_64 

En eclipse, configure las siguientes ‘variables de entorno’ en ‘PyDev’, Intérprete – Python (o cualquiera que esté usando).

  1. ORACLE_HOME = [su ruta de instalación] / instantclient_10_2
  2. LD_LIBRARY_PATH = $ ORACLE_HOME
  3. DYLD_LIBRARY_PATH = $ ORACLE_HOME

Funciono para mi

No sé si ya lo ha solucionado, pero a juzgar por los comentarios, parece que tiene un problema de 32/64 bits en algún lugar de la línea.

cx_Oracle.so es un binario universal con PPC, versiones de Intel de 32 y 64 bits en su interior, pero por su comentario su resultado para libclntsh.dylib.10.1 difiere del mío

 file libclntsh.dylib.10.1 libclntsh.dylib.10.1: Mach-O 64-bit dynamically linked shared library x86_64 

mientras obtengo el mismo resultado que usted si ejecuto el mismo comando en el cliente de 32 bits (que guardo en un directorio separado)

 file libclntsh.dylib.10.1 libclntsh.dylib.10.1: Mach-O dynamically linked shared library i386 

Supongo que cuando se ejecuta desde la línea de comandos está utilizando una ruta diferente y recogiendo el libclntsh apropiado, o que ejecutando a través de Eclipse hace que se ejecute en el modo opuesto a la línea de comandos.

Solución: descargue versiones de 32 y 64 bits de Instant Client desde Oracle, pero en directorios con nombres diferentes, y controle cuál se usa al usar enlaces.

Si te sientes valiente, podrías hacer el trabajo que Oracle no hizo y fusionar los dos dylib en un binario Universal.

 http://developer.apple.com/mac/library/technotes/tn2005/tn2137.html#TNTAG3 

Tuve un problema similar con cx_Oracle y Eclipse: todo funcionaba en Terminal, el mismo no suitable image error en Eclipse. Este fue definitivamente un problema de compatibilidad binaria (para mí, fue de 32 contra 64 bits).

JulesLt tuvo la solución cuando hizo referencia al sitio del desarrollador . lipo opción lipo detallada en ese documento. Fue muy fácil. Como tenemos desarrolladores que utilizan instalaciones tanto de 32 bits como de 64 bits, ya hemos creado un cliente instantáneo para cada uno (no hay máquinas PPC aquí).

Suponiendo que los directorios hermanos de instantclient_32 , instantclient_64 y instantclient_fat donde instantclient_fat es solo una copia del directorio de 32 o 64 bits, lo siguiente debería hacer el truco:

 cd instantclient_32 ; for f in `ls *dylib* genezi sqlplus` ; do lipo -create $f ../instantclient_64/$f -output ../instantclient_fat/$f ; done 

Lo anterior sobrescribirá los ejecutables relevantes en instantclient_fat con los archivos binarios gruesos. Una vez que hayas hecho esto, crea cx_Oracle contra esta biblioteca de instantclient y voilà.

Gracias a JulesLt … esto resolvió una serie de problemas molestos.