Ошибка при сборке cx_Oracle - libclntsh.so.11.1 = ›не найдена

Я пытаюсь создать cx_Oracle для установки Python 2.7.2 и Oracle 11g, но встроенный cx_Oracle.so не может найти libclntsh.so.11.1, поэтому импорт cx_Oracle в Python не выполняется.

/mypath/cx_Oracle-5.1.1/build/lib.linux-x86_64-2.7-11g]$ ldd cx_Oracle.so
    libclntsh.so.11.1 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ae9be290000)
    libc.so.6 => /lib64/libc.so.6 (0x00002ae9be4ab000)
    /lib64/ld-linux-x86-64.so.2 (0x000000389b600000)

У меня есть libclntsh.so.11.1 в каталоге установки моего клиента Oracle:

/apps/oracle/client/11.2.0.1/home1/lib]$ ls -l libclntsh.so*
libclntsh.so -> /apps/oracle/client/11.2.0.1/home1/lib/libclntsh.so.11.1
libclntsh.so.11.1

И cx_Oracle setup.py выбирает этот каталог lib:

/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build
/apps/oracle/client/11.2.0.1/home1/
running build
running build_ext
building 'cx_Oracle' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/apps/oracle/client/11.2.0.1/home1/rdbms/demo -I/apps/oracle/client/11.2.0.1/home1/rdbms/public -I/apps/bweb/python-2.7.2/include/python2.7 -c cx_Oracle.c -o build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -DBUILD_VERSION=5.1.1
In file included from /apps/oracle/client/11.2.0.1/home1/rdbms/public/oci.h:3024,
                 from cx_Oracle.c:10:
/apps/oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10788: warning: function declaration isn't a prototype
/apps/oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10794: warning: function declaration isn't a prototype
gcc -pthread -shared build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -L/apps/oracle/client/11.2.0.1/home1/lib -lclntsh -o build/lib.linux-x86_64-2.7-11g/cx_Oracle.so

Что-то явно не так с этой настройкой?

Спасибо

ОБНОВЛЕНИЕ

Мой LD_LIBRARY_PATH содержит указанный выше каталог lib с libclntsh.so.11.1

$ echo $LD_LIBRARY_PATH
/apps/oracle/client/11.2.0.1/lib

Кажется, это не имеет никакого значения. Я перестраиваю файл cx_Oracle.so, но он по-прежнему показывает libclntsh.so.11.1 => not found, когда я запускаю $ ldd cx_Oracle.so.

Python не может загрузить встроенный модуль:

Python 2.7.2 (default, Jan 19 2012, 14:38:32)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory

РЕШЕНО

Проблема была связана с переменной среды LD_LIBRARY_PATH. Из-за ограничений на настройку, с которой я работаю (corp env), мне пришлось создать cx_Oracle как другой пользователь (системная учетная запись). то есть я запускал это:

$ sudo -u username python27 setup.py build

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


person Alex    schedule 25.07.2012    source источник


Ответы (4)


Добавьте /apps/oracle/client/11.2.0.1/home1/lib/ в переменную среды LD_LIBRARY_PATH, выполните в терминале команду ниже перед запуском python или добавьте ее в свой .bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/apps/oracle/client/11.2.0.1/home1/lib/
person Meitham    schedule 25.07.2012
comment
какую ОС вы используете? В некоторых дистрибутивах UNIX используется LD_LIB_PATH, а не LD_LIBRARY_PATH? Вы также можете проверить права доступа к файлу и убедиться, что он доступен для чтения вашим скриптом. - person Meitham; 25.07.2012
comment
RHEL 6. Я думаю, что LD_LIBRARY_PATH верен, но кажется, что он не принимается во внимание, когда по какой-то причине происходит сборка cx_Oracle. - person Alex; 25.07.2012
comment
Спасибо. Я пробовал это, и, похоже, это не решает. Я установил LD_LIBRARY_PATH и снова построил cx_Oracle.so. По-прежнему отображается libclntsh.so.11.1 = ›не найдено. Подтверждено, что он установлен в интерпретаторе Python, и я не могу загрузить cx_Oracle из-за вышеуказанной проблемы. Проблема в том, что нужно собрать cx_Oracle, верно? os.environ['LD_LIBRARY_PATH'] '/apps/oracle/client/11.2.0.1/lib >>> import cx_Oracle Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory - person Alex; 25.07.2012
comment
Я заметил, что в комментарии чуть выше os.environ ['LD_LIBRARY_PATH'] - это '/apps/oracle/client/11.2.0.1/lib', тогда как в остальной части вопроса общая библиотека находится в / apps / оракул / клиент / 11.2.0.1 / home1 / lib /. Убедитесь, что вы указываете правильный каталог. - person Matt; 25.07.2012
comment
Спасибо, Мэтт - я допустил опечатку в своем комментарии выше, пытаясь правильно отформатировать с помощью Markdown. Он указывал на правильное место. Я нашел проблему сейчас - я дополню свой вопрос решением и приму этот ответ, поскольку это была фундаментальная проблема. - person Alex; 26.07.2012

да. Вы забыли сообщить инструменту кеширования загрузчика, что ему нужно искать библиотеки в этом каталоге. Добавьте этот каталог в /etc/ld.so.conf или аналогичный файл и запустите ldconfig.

person Ignacio Vazquez-Abrams    schedule 25.07.2012
comment
Спасибо. Я уже установил LD_LIBRARY_PATH для включения этого каталога lib - приведет ли это к тому же результату? Я не могу редактировать /etc/ld.so.conf или аналогичный, так как у меня нет прав. - person Alex; 25.07.2012
comment
А пока, но вам действительно следует поговорить с системным администратором. - person Ignacio Vazquez-Abrams; 25.07.2012
comment
В Fedora 20 LD_LIBRARY_PATH не помог мне, но /etc/ld.so.conf.d/ работал: echo /usr/lib/oracle/12.1/client64/lib ›/etc/ld.so.conf. d / oracle.conf; ldconfig - person Catherine Devlin; 12.09.2014

Многие продукты Oracle устанавливают oraenv. Он установит, среди других переменных среды, LD_LIBRARY_PATH, поэтому рассмотрите возможность запуска . oraenv вместо того, чтобы настраивать среду вручную.

person Ekevoo    schedule 13.08.2014

Установите LD_RUN_PATH. (LD_RUN_PATH используется компоновщиком, чтобы указать, где искать библиотеки только во время выполнения.)

Теперь соберите cx_Oracle.

/mypath/cx_Oracle-5.1.1]$ export LD_RUN_PATH="/apps/oracle/client/11.2.0.1/home1/lib"
/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build

Это не потребует установки LD_LIBRARY_PATH при импорте cx_Oracle.

person RoshP    schedule 03.02.2017