cx_Oracle pip安装失败:oci.h:没有这样的文件或目录

时间:2014-09-17 08:12:34

标签: python pip

我在这一点上有点失落。我还试图安装一个旧版本的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('\r\n', '\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)

full error log

5 个答案:

答案 0 :(得分:12)

即使安装了Oracle即时客户端,并设置了$ ORACLE_HOME和$ LD_LIBRARY_PATH以包含客户端的路径,我也遇到了类似的错误,尝试pip install cx_oracle。

听起来好像您可能安装了Instant Client,但没有安装Instant Client SDK。 SDK是一个单独的下载/安装,并且cx_oracle似乎需要两者,因为缺少的包括(&#39; oci.h&#39;以及所有其余的)都位于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路径的某个位置,就应解析包含。

答案 1 :(得分:2)

问题在于SDK不存在,正如bschulz所指出的那样。我能够通过以下步骤解决问题:

  1. 在$ ORACLE_HOME中下载并安装/解压缩“instantclient-basic”和“instantclient-sdk”。

    您可以从here

  2. 获取这些内容
  3. 设置/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
    
  4. 现在运行pip install cx_Oracle==5.3

    我按照这些操作成功地为我安装了5.3。

    您可能需要安装一些其他依赖项,如下载/安装软件包的文档中所列。

答案 2 :(得分:1)

在Mac OS上也经历过同样的事情。

首先,我遵循了this的回答,并通过brew安装了instantclient-basicinstantclient-sqlplus

然后按照同样的想法,我也downloaded SDK Package(instantclient-sdk-macos.x64-19.3.0.0.0dbru.zip)并执行:

brew install instantclient-sdk

答案 3 :(得分:0)

正如bschulz所解释的,这个问题通常解决了设置ORACLE_HOME和LD_LIBRARY_PATH环境变量以确保gcc可以访问头文件。&#xA;在我的情况下它没有解决问题,但检查错误跟踪给了我解决问题的提示。

&#xA;&#xA;

执行pip install cx_Oracle显示此错误:

&#xA;&#xA;
  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&#xA; cx_Oracle.c:10:17:错误:oci.h:没有这样的文件或目录&#xA; cx_Oracle.c:11: 18:错误:或id.h:没有这样的文件或目录&#xA; cx_Oracle.c:27:2:错误:#error不支持的OCI版本。&#xA;  
&#xA;&#xA; < p>在man中查找-I标志gcc:

&#xA;&#xA;
  -I dir将目录dir添加到要搜索头文件的目录列表中。 ....&#xA;  
&#xA;&#xA;

所以问题在于这些标志值:

&#xA;&#xA;
  -I / home / oracle / product / 12.1.0 / rdbms / demo&#xA; -I / home / oracle / product / 12.1.0 / rdbms / public&#xA; -I / usr / include /python2.7

我无法真正告诉为什么-I标志被设置为这些值,但是简单的方法来实现它工作是修改从pip命令行传递正确值的标志:

&#xA;&#xA;
  pip install cx_Oracle --global-option = build_ext --global-option =“ -I / home / oracle / instantclient_12_1 / sdk / include“&#xA;  
&#xA;&#xA;

这样一个新的-I值被发送到gcc和安装结束正确。

&#XA;

答案 4 :(得分:0)

来自cx_Oracle 6:

  • 二进制车轮可在PyPI上使用,因此很多人都不需要 编译
  • 如果你确实需要编译,那么Oracle头文件不是 在使用Oracle时,您不应该/不需要设置ORACLE_HOME Instant Client。

在cx_Oracle 5.2和5.3中,如果使用Instant Client RPM,则无需在安装时设置ORACLE_HOME,也不需要在运行时设置LD_LIBRARY_PATH。如果您使用Instant Client zips(或真正的DB $ ORACLE_HOME安装),则可以在安装cx_Oracle之前设置FORCE_RPATH = 1。如果这样做,则不需要在运行时设置LD_LIBRARY_PATH。这个功能在cx_Oracle中有几个版本。