cx_Oracle не распознает место установки программного обеспечения Oracle для установки в Linux

Мне удалось успешно установить cx_Oracle для использования с Python 3.4 на моем ноутбуке с Windows 8, и теперь я пытаюсь получить ту же настройку (cx_Oracle с Python 3.4) на машине Linux. При запуске файла setup.py из cx_Oracle-5.1.3.tar.gz я получаю эту ошибку:

    sudo python3 setup.py install
    Traceback (most recent call last):
       File "setup.py", line 135, in <module>
          raise DistutilsSetupError("cannot locate an Oracle software " \
    distutils.errors.DistutilsSetupError: cannot locate an Oracle software installation

После некоторых других ответов я посмотрел (easy_install cx_Oracle (python package) в Windows, https://gist.github.com/jarshwah/3863378) Я установил эти 3 мгновенных клиентских rpms:

rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.i386.rpm
rpm -ivh oracle-instantclient12.1-devel-12.1.0.2.0-1.i386.rpm
rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.i386.rpm

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

Я по-прежнему получаю ту же ошибку «не могу найти установку программного обеспечения Oracle» каждый раз, когда пытаюсь запустить файл setup.py.

Есть идеи, что мне нужно сделать, чтобы успешно установить cx_oracle?

Обновите для получения дополнительной информации:

echo $ ORACLE_HOME возвращает /instantclientsudo python3 setup.py install1, где установлены файлы rpm.

Это содержимое моего каталога / Instantclientsudo python3 setup.py install1:

adrci                  libnnz12.so       libsqlplusic.so  tnsnames.ora
BASIC_README           libocci.so        libsqlplus.so    tnsnames.ora_andy
genezi                 libocci.so.12.1   ojdbc6.jar       uidrvci
glogin.sql             libociei.so       ojdbc7.jar       xstreams.jar
libclntshcore.so.12.1  libocijdbc12.so   sdk
libclntsh.so           libons.so         sqlplus
libclntsh.so.12.1      liboramysql12.so  SQLPLUS_README

Это немного отличается от каталога, который у меня есть для установки Windows 8 - в нем есть файлы .dll и .sym, например orasql12.dll. Должны ли в Linux-версии мгновенной установки клиента быть другие файлы?

Обновление с частичным решением:

Я нашел решение, которое правильно установило cx_Oracle, но только во время этого экземпляра оболочки:

Я установил эти две переменные среды:

export ORACLE_HOME=/instantclientsudo python3 setup.py install1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME

Затем я создал символическую ссылку:

ln -s libclntsh.so.12.1 libclntsh.so

После этого зайти в папку cx_oracle и сделать это сработало:

python3 setup.py build
python3 setup.py install

Почему-то sudo python3 setup.py install для этого не работал.

Обновление со ссылкой на связанный вопрос:

Моя следующая проблема заключается в том, чтобы переменные среды сохранялись вне экземпляра оболочки, поэтому мне не нужно каждый раз определять переменные среды. Переменные среды, которые я ввел в profile.d, отображаются, когда я повторяю их, но python не может правильно импортировать cx_oracle, и мне по какой-то причине приходится снова экспортировать переменные среды. Я не знаю надлежащей процедуры для публикации другого вопроса, связанного с одним, поэтому я открыл здесь новый вопрос:

Переменные среды profile.d в Linux не t работать с cx_oracle в Python

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


person Acuity    schedule 19.06.2015    source источник
comment
Вы экспортировали переменную оболочки ORACLE_HOME? export ORACLE_HOME=/your/oracle/dir   -  person mhawke    schedule 19.06.2015
comment
Ага, я сделал. И echo $ORACLE_HOME возвращает мой каталог oracle /instantclient_12_1 Это правильно?   -  person Acuity    schedule 19.06.2015
comment
Если у вас есть загруженные RPM с Instant Client Downloads for Linux x86 и установлены с использованием rpm -ivh, файлы должны быть установлены в /usr/lib/oracle, а не /instantclient_12_1. Вы уверены, что установили с rpm, или вы установили, распаковав zip-файлы, доступные на той же странице загрузки?   -  person mhawke    schedule 19.06.2015
comment
Вижу, я нашел папку /usr/lib/oracle. Могу ли я установить ORACLE_HOME на /usr/lib/oracle? Я попробую и посмотрю, сработает ли это. Я не очень уверен, откуда взялась папка /instantclient_12_1.   -  person Acuity    schedule 19.06.2015
comment
Я пытаюсь использовать /usr/lib/oracle как ORACLE_HOME, и я также добавил ORACLE_HOME в PATH, но все равно получаю такое же сообщение об ошибке при запуске setup.py. Есть другие идеи? echo $ORACLE_HOME дает мне /usr/lib/oracle и echo $PATH дает мне /usr/lib/oracle:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/maven/apache-maven-3.2.5/bin:/root/bin, я сначала помещаю домашнюю папку oracle.   -  person Acuity    schedule 19.06.2015


Ответы (2)


Обновлено

Как Петриборг предложил, установка LD_RUN_PATH во время сборки будет включать путь к файлам общей библиотеки Oracle в cx_Oracle общей библиотеке, которая создается во время установки. Это устраняет необходимость в LD_LIBRARY_PATH, как я предложил в своем первом ответе.


Для используемых вами RPM ORACLE_HOME должно быть установлено на /usr/lib/oracle/12.1/client. Если вы используете pip:

$ export ORACLE_HOME=/usr/lib/oracle/12.1/client
$ export LD_RUN_PATH=/usr/lib/oracle/12.1/client/lib:$LD_RUN_PATH
$ pip install cx_Oracle
$ python -c 'import cx_Oracle; print(cx_Oracle.version)'
5.1.3

Прочтите эту документацию для получения информации об установке и запуске приложений, которые использовать клиентские библиотеки.

person mhawke    schedule 20.06.2015
comment
Вместо установки LD_LIBRARY_PATH, если вы установите LD_RUN_PATH во время сборки, путь к библиотеке будет добавлен в файлы .so, и они автоматически волшебным образом найдут библиотеку. См. stackoverflow.com/a/882150/2815 - person Petriborg; 20.06.2015
comment
@Petriborg: спасибо, я не знал про LD_RUN_PATH, но это определенно лучше, чем указывать LD_LIBRARY_PATH. Я обновил ответ этой информацией. Спасибо - person mhawke; 20.06.2015
comment
Спасибо за ответы. Я не использую pip, я просто использую прямой setup.py файл из папки cx_oracle. В любом случае, я нашел что-то, для чего мне установили cx_oracle, и обновил его в своем вопросе! - person Acuity; 22.06.2015
comment
Еще одна вещь, с которой я столкнулся: при использовании пути /usr/lib/oracle/12.1/client для ORACLE_HOME и для LD_LIBRARY_PATH я сталкиваюсь с этой ошибкой, когда пытаюсь запустить код, использующий cx_oracle: ImportError: libclntsh.so.12.1: wrong ELF class: ELFCLASS32. Не знаю почему, но вместо этого работает мой каталог instantclient_12_1. Могу ли я переустановить cx_oracle, используя переменную среды LD_RUN_PATH? - person Acuity; 23.06.2015

Когда я попытался установить cx_Oracle с одной переменной LD_LIBRARY_PATH в Ubuntu 16.04 с python 2.7.12 и клиентом Oracle 12.1.0.2, установка pip завершилась ошибкой и ищет файлы заголовков, которые больше не доступны с клиентом Oracle 12.1.0.2. Он отлично работает с LD_RUN_PATH

person user3235357    schedule 18.12.2016
comment
Во время установки cx_Oracle 5.2 вы можете установить FORCE_RPATH = 1, чтобы cx_Oracle использовал rpath. При этом вам не нужны LD_LIBRARY_PATH или LD_RUN_PATH. - person Christopher Jones; 19.12.2016