【问题标题】:cx_Oracle pip install fails: oci.h: No such file or directorycx_Oracle pip install 失败:oci.h:没有这样的文件或目录
【发布时间】:2014-09-17 08:12:33
【问题描述】:

我对这个有点迷茫。我还尝试安装旧版本的 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

【问题讨论】:

  • 这些有什么用吗? google.co.uk/…
  • 你是用 sudo 执行这个命令吗?
  • @NPE,谢谢。其中许多指向 python-devel 包。但是,我相信我拥有它,因为我能够毫不费力地构建 numpy。
  • @user1767754,没有。我实际上在这台机器上没有超级用户权限。

标签: python pip


【解决方案1】:

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

听起来您可能已经安装了 Instant Client,但没有安装 Instant Client SDK。 SDK 是一个单独的下载/安装,cx_oracle 似乎需要两者,因为缺少的包含('oci.h' 和所有其余部分)位于 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 路径中的某处,include 就应该能够解析。

【讨论】:

  • “只要 SDK 安装在 ORACLE_HOME 路径的某处”是我问题的关键。谢谢
【解决方案2】:

问题在于 bschulz 指出的 SDK 不存在。我可以通过以下步骤解决此问题:

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

    您可以从here获取它们

  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。

您可能需要安装一些额外的依赖项,这些依赖项列在您应该下载/安装的软件包的文档中。

【讨论】:

  • 欢迎来到Stack Overflow,精彩的帖子! SO 有很多很棒的格式可用。使用编辑按钮查看我如何更改您的帖子。
【解决方案3】:

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

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

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

brew install instantclient-sdk

【讨论】:

    【解决方案4】:

    正如 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 标志:

    -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 并且安装正确结束。

    【讨论】:

      【解决方案5】:

      来自 cx_Oracle 6:

      • 在 PyPI 上可以使用二进制轮子,所以很多人不需要 编译
      • 如果确实需要编译,Oracle 头文件不需要 需要,并且在使用 Oracle 时不应该/不需要设置 ORACLE_HOME 即时客户端。

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

      【讨论】:

      • 所以,Christopher,我正在尝试在 mac 上安装 cx-Oracle==5.2.1。我有我的ORACLE_HOME LD_LIBRARY_PATH 设置。我尝试按照您的建议取消设置,对于ORACLE_HOME,我收到错误Oracle home () does not refer to an 10g, 11g or 12c installation,对于LD_LIBRARY_PATH,无论路径如何,我都收到'oci.h' file not found。有什么建议吗?
      猜你喜欢
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2016-12-11
      • 2018-04-01
      • 2013-01-13
      • 2021-05-13
      相关资源
      最近更新 更多