сбой установки CX Oracle pip: oci.ч: нет такого файла или каталога

Я немного потерялся в этом. Я также попытался установить более старую версию cx_Oracle, которую я установил в отдельном virtualenv, но она также терпит неудачу в том же месте с тем же сообщением об ошибке.

$ pip install cx_Oracle
(...)

cx_Oracle.c:10:17: error: oci.h: No such file or directory
cx_Oracle.c:11:18: error: orid.h: No such file or directory
cx_Oracle.c:12:16: error: xa.h: No such file or directory

error: command 'gcc' failed with exit status 1
(...)
----------------------------------------
Cleaning up...
Command /R/.virtualenv/myenv/bin/python -c "import setuptools, tokenize;__file__='/R/.virtualenv/myenv/build/cx-Oracle/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('rn', 'n'), __file__, 'exec'))" install --record /tmp/pip-g5eyNG-record/install-record.txt --single-version-externally-managed --compile --install-headers /R/.virtualenv/myenv/include/site/python2.7 failed with error code 1 in /R/.virtualenv/myenv/build/cx-Oracle
Traceback (most recent call last):
  File "/R/.virtualenv/myenv/bin/pip", line 11, in <module>
    sys.exit(main())
  File "/R/.virtualenv/myenv/lib/python2.7/site-packages/pip/__init__.py", line 185, in main
    return command.main(cmd_args)
  File "/R/.virtualenv/myenv/lib/python2.7/site-packages/pip/basecommand.py", line 161, in main
    text = 'n'.join(complete_log)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 70: ordinal not in range(128)

полный журнал ошибок

4 ответов


Я столкнулся с аналогичной ошибкой, пытаясь pip установить cx_oracle, даже после установки Oracle instant client и после установки $ORACLE_HOME и $LD_LIBRARY_PATH для включения пути к клиенту.

похоже, что вы могли установить мгновенный клиент, но не мгновенный клиент SDK. SDK-это отдельная загрузка / установка, и cx_oracle, похоже, нуждается в обоих, поскольку отсутствует ('oci.ч и все остальные) находятся в SDK.

Если у вас нет уже там, вы можете найти страницы загрузки Oracle Instant Client / SDK здесь:

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

предполагая, что вы уже загрузили и установили клиент, соответствующие вашей платформе, например это:

oracle-instantclient11.2-basic-11.2.0.1.0-1.архитектуру x86_64.zip

вам также необходимо загрузить и установить соответствующий SDK, например один:

oracle-instantclient11.2-sdk-11.2.0.1.0-1.архитектуру x86_64.zip

пока SDK установлен где-то на путях в ORACLE_HOME и LD_LIBRARY_PATH, includes должны разрешаться.


проблема с SDK нету как отметил bschulz. Я смог исправить эту проблему, выполнив следующие шаги:

  1. скачал и установил/распаковал "instantclient-basic" и "instantclient-sdk" в $ORACLE_HOME.

    вы можете получить их из здесь

  2. настройки /etc/environment

    export ORACLE_HOME=/opt/oracle/instantclient_12_2
    export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
    cd $ORACLE_HOME
    unzip /sdk/ottclasses.zip
    cp -R ./sdk/* .
    cp -R ./sdk/include/* .
    ln -s libclntsh.so.12.1 libclntsh.so
    ln -s libocci.so.12.1 libocci.so
    

Теперь бегите pip install cx_Oracle==5.3

Я следил за этим и успешно установлен 5.3 для меня.

возможно, Вам потребуется установить некоторые дополнительные зависимости, перечисленные в документации пакетов, которые вы должны загрузить / установить.


как объясняет bschulz, эта проблема обычно решается установкой переменных среды ORACLE_HOME и LD_LIBRARY_PATH, чтобы убедиться, что gcc может получить доступ к файлам заголовков. В моем случае это не решило проблему, но проверка трассировки ошибок дала мне подсказку, чтобы решить проблему.

выполнение pip install cx_Oracle показало эту ошибку:

gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/home/oracle/product/12.1.0/rdbms/demo -I/home/oracle/product/12.1.0/rdbms/public -I/usr/include/python2.7 -c cx_Oracle.c -o build/temp.linux-x86_64-2.7-12c/cx_Oracle.o -DBUILD_VERSION=5.2.1
cx_Oracle.c:10:17: error: oci.h: No such file or directory
cx_Oracle.c:11:18: error: orid.h: No such file or directory
cx_Oracle.c:27:2: error: #error Unsupported version of OCI.

глядя вверх-я флаг в man gcc:

-I dir  Add the directory dir to the list of directories to be searched for header files.  ....

Итак, проблема была в этом флаге значения:

-I/home/oracle/product/12.1.0/rdbms/demo 
-I/home/oracle/product/12.1.0/rdbms/public 
-I/usr/include/python2.7

Я не могу сказать, почему флаг-I был установлен на эти значения, но простой способ заставить его работать - изменить флаг, передающий правильные значения из командной строки pip:

 pip install cx_Oracle --global-option=build_ext --global-option="-I/home/oracle/instantclient_12_1/sdk/include"

таким образом, новое значение-I отправляется в gcc, и установка заканчивается правильно.


из cx_Oracle 6:

  • бинарные колеса доступны на PyPI, поэтому многим людям не нужно compile
  • Если вам нужно скомпилировать, заголовочные файлы Oracle не являются необходимо, и вы не должны/не должны устанавливать ORACLE_HOME при использовании Oracle Мгновенный Клиент.

в cx_Oracle 5.2 и 5.3, если вы используете мгновенные клиентские RPMs, вам не нужно устанавливать ORACLE_HOME во время установки, и вам не нужно устанавливать LD_LIBRARY_PATH во время выполнения. Если вы используете Мгновенные клиентские молнии (или реальная установка DB $ORACLE_HOME), вы можете установить FORCE_RPATH=1 Перед установкой cx_Oracle. Если вы это сделаете, вам не нужно будет устанавливать LD_LIBRARY_PATH во время выполнения. Эта функция была в cx_Oracle для нескольких версий.