Проблемы с PyDev и внешними библиотеками в OS X - PullRequest
4 голосов
/ 21 мая 2010

Я успешно установил последнюю версию PyDev в Eclipse (3.5.1) под OS X 10.6.3 с python 2.6.1
У меня проблемы с работой установленных библиотек.
Например, я пытаюсь использовать библиотеку cx_Oracle, которая отлично работает, если вызывается из интерпретатора python из простых скриптов, созданных с помощью какого-либо текстового редактора.
Но я не могу заставить его работать в Eclipse: у меня есть небольшой фрагмент кода:

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

Если я выполняю его из Eclipse, я получаю следующую ошибку:

import cx_Oracle
  File "build/bdist.macosx-10.6-universal/egg/cx_Oracle.py", line 7, in <module>
  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

Тот же фрагмент отлично работает из оболочки Python

Я настроил интерпретатор в Eclipse в настройках -> PyDev -> Интерпретатор - Python, используя опцию Auto Config и выбирая все найденные библиотеки.

Что я здесь не так делаю?

Редактировать: запуск

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

из командной строки говорит следующее:

/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

Ответы [ 3 ]

5 голосов
/ 10 октября 2011

В eclipse установите следующие «переменные окружения» в «PyDev», «Интерпретатор - Python» (или то, что вы когда-либо используете).

  1. ORACLE_HOME = [ваш путь установки] / instantclient_10_2
  2. LD_LIBRARY_PATH = $ ORACLE_HOME
  3. DYLD_LIBRARY_PATH = $ ORACLE_HOME

Это сработало для меня.

1 голос
/ 28 июля 2010

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

cx_Oracle.so - это универсальный двоичный файл с PPC, 32- и 64-битной версиями Intel внутри, но из вашего комментария ваш результат для libclntsh.dylib.10.1 отличается от моего

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

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

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

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

Решение - загрузите 32-разрядную и 64-разрядную версии Instant Client из Oracle, но в каталогах с разными именами, и укажите, какая из них используется с помощью ссылок.

Если вы чувствуете себя смелым, вы можете выполнить работу, которую не смог выполнить Oracle, и объединить два dylib в универсальный двоичный файл.

http://developer.apple.com/mac/library/technotes/tn2005/tn2137.html#TNTAG3
0 голосов
/ 15 января 2011

У меня была похожая проблема с cx_Oracle и Eclipse: все работало в терминале, то же самое no suitable image error в Eclipse. Это определенно была проблема бинарной совместимости (для меня это была 32- или 64-разрядная версия).

У JulesLt было решение, когда он ссылался на сайт разработчика . Я использовал опцию lipo, подробно описанную в этом документе. Это было удивительно легко. Поскольку у нас есть разработчики, использующие как 32-разрядные, так и 64-разрядные установки, у нас уже был создан мгновенный клиент для каждого (здесь нет машин PPC).

Предполагая, что дочерние каталоги instantclient_32, instantclient_64 и instantclient_fat - где instantclient_fat - это просто копия 32- или 64-битного каталога - нужно выполнить следующее:

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

Выше будут перезаписаны соответствующие исполняемые файлы в instantclient_fat с толстыми двоичными файлами. Сделав это, создайте cx_Oracle против этой библиотеки instantclient и вуаля.

Благодаря JulesLt ... это решило ряд досадных проблем.

...